simple-navigation 3.11.0 → 3.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.gitignore +6 -0
  2. data/.rspec +2 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG +11 -0
  5. data/Gemfile +2 -16
  6. data/Guardfile +5 -0
  7. data/LICENSE +22 -0
  8. data/README.md +40 -0
  9. data/Rakefile +6 -39
  10. data/generators/navigation_config/templates/config/navigation.rb +7 -5
  11. data/init.rb +1 -0
  12. data/install.rb +5 -0
  13. data/lib/simple_navigation/adapters/rails.rb +5 -1
  14. data/lib/simple_navigation/core/configuration.rb +5 -1
  15. data/lib/simple_navigation/core/item.rb +2 -1
  16. data/lib/simple_navigation/core/item_adapter.rb +4 -4
  17. data/lib/simple_navigation/core/item_container.rb +6 -1
  18. data/lib/simple_navigation/rendering/renderer/breadcrumbs.rb +2 -2
  19. data/lib/simple_navigation/rendering/renderer/links.rb +2 -2
  20. data/lib/simple_navigation/rendering/renderer/list.rb +1 -1
  21. data/lib/simple_navigation/version.rb +3 -0
  22. data/lib/simple_navigation.rb +1 -0
  23. data/simple-navigation.gemspec +40 -0
  24. data/spec/initializers/have_css_matcher.rb +13 -0
  25. data/spec/lib/simple_navigation/adapters/padrino_spec.rb +23 -25
  26. data/spec/lib/simple_navigation/adapters/rails_spec.rb +276 -250
  27. data/spec/lib/simple_navigation/adapters/sinatra_spec.rb +64 -53
  28. data/spec/lib/simple_navigation/core/configuration_spec.rb +128 -106
  29. data/spec/lib/simple_navigation/core/item_adapter_spec.rb +144 -168
  30. data/spec/lib/simple_navigation/core/item_container_spec.rb +361 -339
  31. data/spec/lib/simple_navigation/core/item_spec.rb +571 -434
  32. data/spec/lib/simple_navigation/core/items_provider_spec.rb +35 -49
  33. data/spec/lib/simple_navigation/rails_controller_methods_spec.rb +194 -173
  34. data/spec/lib/simple_navigation/rendering/helpers_spec.rb +381 -225
  35. data/spec/lib/simple_navigation/rendering/renderer/base_spec.rb +205 -164
  36. data/spec/lib/simple_navigation/rendering/renderer/breadcrumbs_spec.rb +87 -67
  37. data/spec/lib/simple_navigation/rendering/renderer/json_spec.rb +52 -31
  38. data/spec/lib/simple_navigation/rendering/renderer/links_spec.rb +75 -48
  39. data/spec/lib/simple_navigation/rendering/renderer/list_spec.rb +62 -174
  40. data/spec/lib/simple_navigation/rendering/renderer/text_spec.rb +41 -28
  41. data/spec/lib/simple_navigation_spec.rb +207 -225
  42. data/spec/spec_helper.rb +53 -82
  43. data/uninstall.rb +1 -0
  44. metadata +100 -22
  45. data/README +0 -22
  46. data/VERSION +0 -1
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ .DS_Store
2
+ rdoc
3
+ pkg
4
+ coverage
5
+ Gemfile.lock
6
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format=documentation
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - 2.0.0
4
+ - 2.1.1
data/CHANGELOG CHANGED
@@ -1,3 +1,14 @@
1
+ *3.12.0
2
+
3
+ * Relax hash constraint on item_adapter. Thanks to Ramon Tayag.
4
+ * Fixed hidden special character in navigation template. Credits to Stef Lewandowski
5
+ * Added full MIT license text. Thanks to Ben Armstrong.
6
+ * Added license to gemspec. Thanks to Troy Thompson.
7
+ * Allow defining other html attributes than :id and :class on menu container. Credits to Jacek Tomaszewski.
8
+ * Added new config option "consider_item_names_as_safe". Thanks to Alexey Naumov.
9
+ * Big cleanup of specs, removed jeweler in favor of the "bundler" way. Huge thank you to Simon Courtois.
10
+ * Added more powerful name generator which yields the item itself in addition to the item's name. Credits to Simon Curtois.
11
+
1
12
  *3.11.0
2
13
 
3
14
  * Added Json renderer. Thanks to Alberto Avila.
data/Gemfile CHANGED
@@ -1,17 +1,3 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
- gem 'activesupport', '>= 2.3.2'
4
-
5
- # install the rails group if you want to ensure rails compatibility -
6
- # but you've already got rails installed anyway, right? :-)
7
- group :rails do
8
- gem 'actionpack', '>= 2.3.2'
9
- end
10
-
11
- group :development do
12
- gem 'rspec', '>= 2.0.1'
13
- gem 'json_spec', '~> 1.1.1'
14
- gem 'rake'
15
- gem 'rdoc'
16
- gem 'jeweler'
17
- end
3
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard :rspec do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { 'spec' }
5
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 codeplant GmbH
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # Simple Navigation
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/simple-navigation.png)](http://badge.fury.io/rb/simple-navigation)
4
+ [![Build Status](https://secure.travis-ci.org/codeplant/simple-navigation.png?branch=master)](http://travis-ci.org/codeplant/simple-navigation)
5
+ [![Code Climate](https://codeclimate.com/github/codeplant/simple-navigation.png)](https://codeclimate.com/github/codeplant/simple-navigation)
6
+ [![Coverage Status](https://coveralls.io/repos/codeplant/simple-navigation/badge.png)](https://coveralls.io/r/codeplant/simple-navigation)
7
+
8
+ Simple Navigation is a ruby library for creating navigations (with multiple levels) for your Rails 2, Rails 3, Rails 4, Sinatra or Padrino applications. It runs with all ruby versions (including ruby 2.0).
9
+
10
+ ## Documentation
11
+
12
+ For the complete documentation, take a look at the [project's wiki](http://wiki.github.com/codeplant/simple-navigation).
13
+
14
+ ## RDoc
15
+
16
+ You can consult the project's RDoc on [RubyDoc.info](http://rubydoc.info/github/codeplant/simple-navigation/frames).
17
+
18
+ If you need to generate the RDoc files locally, check out the repository and simply call the `rake rdoc` in the project's folder.
19
+
20
+ ## Online Demo
21
+
22
+ You can try simple-navigation with the [online demo](http://simple-navigation-demo.codeplant.ch).
23
+
24
+ The source code of this online demo is [available on Github](http://github.com/codeplant/simple-navigation-demo).
25
+
26
+ ## Feedback and Questions
27
+
28
+ Don't hesitate to come talk on the [project's group](http://groups.google.com/group/simple-navigation).
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it (https://github.com/codeplant/simple-navigation/fork)
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create new Pull Request
37
+
38
+ ## License
39
+
40
+ Copyright (c) 2014 codeplant GmbH, released under the MIT license
data/Rakefile CHANGED
@@ -1,47 +1,14 @@
1
- require 'rake'
1
+ require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
3
  require 'rdoc/task'
4
4
 
5
- desc 'Default: run specs.'
6
- task :default => :spec
5
+ RSpec::Core::RakeTask.new(:spec)
7
6
 
8
- desc 'Run the specs'
9
- RSpec::Core::RakeTask.new(:spec) do |t|
10
- t.rspec_opts = ['--colour --format progress']
11
- end
12
-
13
- namespace :spec do
14
- desc "Run all specs with RCov"
15
- RSpec::Core::RakeTask.new(:rcov) do |t|
16
- t.rspec_opts = ['--colour --format progress']
17
- t.rcov = true
18
- t.rcov_opts = ['--exclude', 'spec,/Users/']
19
- end
20
- end
7
+ task default: :spec
21
8
 
22
- desc 'Generate documentation for the simple_navigation plugin.'
23
- RDoc::Task.new(:rdoc) do |rdoc|
9
+ RDoc::Task.new do |rdoc|
24
10
  rdoc.rdoc_dir = 'rdoc'
25
11
  rdoc.title = 'SimpleNavigation'
26
- rdoc.options << '--line-numbers' << '--inline-source'
27
- rdoc.rdoc_files.include('README')
28
- rdoc.rdoc_files.include('lib/**/*.rb')
29
- end
30
-
31
- begin
32
- require 'jeweler'
33
- Jeweler::Tasks.new do |gemspec|
34
- gemspec.name = "simple-navigation"
35
- gemspec.summary = "simple-navigation is a ruby library for creating navigations (with multiple levels) for your Rails2, Rails3, Sinatra or Padrino application."
36
- gemspec.email = "andreas.schacke@gmail.com"
37
- gemspec.homepage = "http://github.com/andi/simple-navigation"
38
- gemspec.description = "With the simple-navigation gem installed you can easily create multilevel navigations for your Rails, Sinatra or Padrino applications. The navigation is defined in a single configuration file. It supports automatic as well as explicit highlighting of the currently active navigation through regular expressions."
39
- gemspec.authors = ["Andi Schacke", "Mark J. Titorenko"]
40
- gemspec.rdoc_options = ["--inline-source", "--charset=UTF-8"]
41
- gemspec.files = FileList["[A-Z]*", "{lib,spec,rails,generators}/**/*"] - FileList["**/*.log", "Gemfile.lock"]
42
- gemspec.rubyforge_project = 'andi'
43
- end
44
- Jeweler::GemcutterTasks.new
45
- rescue LoadError => e
46
- puts "Jeweler not available (#{e}). Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
12
+ rdoc.options << '--inline-source'
13
+ rdoc.rdoc_files.include('README.md', 'lib/**/*.rb')
47
14
  end
@@ -24,11 +24,14 @@ SimpleNavigation::Configuration.run do |navigation|
24
24
 
25
25
  # If you need to add custom html around item names, you can define a proc that will be called with the name you pass in to the navigation.
26
26
  # The example below shows how to wrap items spans.
27
- # navigation.name_generator = Proc.new {|name| "<span>#{name}</span>"}
27
+ # navigation.name_generator = Proc.new {|name, item| "<span>#{name}</span>"}
28
28
 
29
29
  # The auto highlight feature is turned on by default.
30
30
  # This turns it off globally (for the whole plugin)
31
31
  # navigation.auto_highlight = false
32
+
33
+ # If this option is set to true, all item names will be considered as safe (passed through html_safe). Defaults to false.
34
+ # navigation.consider_item_names_as_safe = false
32
35
 
33
36
  # Define the primary navigation
34
37
  navigation.items do |primary|
@@ -60,13 +63,12 @@ SimpleNavigation::Configuration.run do |navigation|
60
63
  # You can also specify a condition-proc that needs to be fullfilled to display an item.
61
64
  # Conditions are part of the options. They are evaluated in the context of the views,
62
65
  # thus you can use all the methods and vars you have available in the views.
63
- primary.item :key_3, 'Admin', url, :class => 'special', :if => Proc.new { current_user.admin? }
66
+ primary.item :key_3, 'Admin', url, :class => 'special', :if => Proc.new { current_user.admin? }
64
67
  primary.item :key_4, 'Account', url, :unless => Proc.new { logged_in? }
65
68
 
66
- # you can also specify a css id or class to attach to this particular level
69
+ # you can also specify html attributes to attach to this particular level
67
70
  # works for all levels of the menu
68
- # primary.dom_id = 'menu-id'
69
- # primary.dom_class = 'menu-class'
71
+ # primary.dom_attributes = {id: 'menu-id', class: 'menu-class'}
70
72
 
71
73
  # You can turn off auto highlighting for a specific level
72
74
  # primary.auto_highlight = false
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + "/rails/init"
data/install.rb ADDED
@@ -0,0 +1,5 @@
1
+ begin
2
+ puts IO.read(File.join(File.dirname(__FILE__), 'README'))
3
+ rescue Exception => e
4
+ puts "The following error ocurred while installing the plugin: #{e.message}"
5
+ end
@@ -39,7 +39,7 @@ module SimpleNavigation
39
39
  end
40
40
 
41
41
  def link_to(name, url, options={})
42
- template.link_to(html_safe(name), url, options) if template
42
+ template.link_to(link_title(name), url, options) if template
43
43
  end
44
44
 
45
45
  def content_tag(type, content, options={})
@@ -76,6 +76,10 @@ module SimpleNavigation
76
76
  context.controller || context :
77
77
  context
78
78
  end
79
+
80
+ def link_title name
81
+ SimpleNavigation.config.consider_item_names_as_safe ? html_safe(name) : name
82
+ end
79
83
 
80
84
  end
81
85
  end
@@ -6,7 +6,7 @@ module SimpleNavigation
6
6
  class Configuration
7
7
  include Singleton
8
8
 
9
- attr_accessor :renderer, :selected_class, :active_leaf_class, :autogenerate_item_ids, :id_generator, :auto_highlight, :name_generator
9
+ attr_accessor :renderer, :selected_class, :active_leaf_class, :autogenerate_item_ids, :id_generator, :auto_highlight, :name_generator, :consider_item_names_as_safe
10
10
  attr_reader :primary_navigation
11
11
 
12
12
  class << self
@@ -32,6 +32,10 @@ module SimpleNavigation
32
32
  @id_generator = Proc.new {|id| id.to_s }
33
33
  @name_generator = Proc.new {|name| name}
34
34
  @auto_highlight = true
35
+ @consider_item_names_as_safe = true
36
+ if defined?(ActiveSupport::Deprecation)
37
+ ActiveSupport::Deprecation.warn "simple-navigation: consider_item_names_as_safe will be set to false by default in 3.13.0 release, hence item names will be considered unsafe by default. See https://github.com/codeplant/simple-navigation/wiki", caller
38
+ end
35
39
  end
36
40
 
37
41
  # This is the main method for specifying the navigation items. It can be used in two ways:
@@ -13,6 +13,7 @@ module SimpleNavigation
13
13
  options = setup_url_and_options(url_or_options, options_or_nil)
14
14
  @container.dom_class = options.delete(:container_class) if options[:container_class]
15
15
  @container.dom_id = options.delete(:container_id) if options[:container_id]
16
+ @container.dom_attributes = options[:container_attributes] ? options.delete(:container_attributes) : {}
16
17
  @container.selected_class = options.delete(:selected_class) if options[:selected_class]
17
18
  @key = key
18
19
  @method = options.delete(:method)
@@ -30,7 +31,7 @@ module SimpleNavigation
30
31
  def name(options = {})
31
32
  options.reverse_merge!(:apply_generator => true)
32
33
  if (options[:apply_generator])
33
- SimpleNavigation.config.name_generator.call(@name)
34
+ SimpleNavigation.config.name_generator.call(@name, self)
34
35
  else
35
36
  @name
36
37
  end
@@ -20,13 +20,13 @@ module SimpleNavigation
20
20
  # See SimpleNavigation::ItemContainer#item for the purpose of these methods.
21
21
  class ItemAdapter
22
22
  extend Forwardable
23
-
23
+
24
24
  def_delegators :item, :key, :name, :url
25
25
 
26
26
  attr_reader :item
27
27
 
28
28
  def initialize(item)
29
- @item = item.instance_of?(Hash) ? to_object(item) : item
29
+ @item = item.is_a?(Hash) ? to_object(item) : item
30
30
  end
31
31
 
32
32
  # Returns the options for this item. If the wrapped item does not implement an options method, an empty hash is returned.
@@ -45,7 +45,7 @@ module SimpleNavigation
45
45
  end
46
46
 
47
47
  protected
48
-
48
+
49
49
  # Converts the specified hash into an object. Each key will be added as method.
50
50
  #
51
51
  def to_object(hash)
@@ -60,4 +60,4 @@ module SimpleNavigation
60
60
  end
61
61
 
62
62
  end
63
- end
63
+ end
@@ -4,7 +4,7 @@ module SimpleNavigation
4
4
  class ItemContainer
5
5
 
6
6
  attr_reader :items, :level
7
- attr_accessor :renderer, :dom_id, :dom_class, :auto_highlight, :selected_class
7
+ attr_accessor :renderer, :dom_id, :dom_class, :dom_attributes, :auto_highlight, :selected_class
8
8
 
9
9
  def initialize(level=1) #:nodoc:
10
10
  @level = level
@@ -13,6 +13,11 @@ module SimpleNavigation
13
13
  @auto_highlight = true
14
14
  end
15
15
 
16
+ def dom_attributes
17
+ # backward compability for #dom_id and #dom_class
18
+ (@dom_attributes || {}).merge({id: dom_id, class: dom_class}.reject{|k, v| v.nil?})
19
+ end
20
+
16
21
  # Creates a new navigation item.
17
22
  #
18
23
  # The <tt>key</tt> is a symbol which uniquely defines your navigation item in the scope of the primary_navigation or the sub_navigation.
@@ -6,7 +6,7 @@ module SimpleNavigation
6
6
  #
7
7
  # By default, the renderer sets the item's key as dom_id for the rendered <a> element unless the config option <tt>autogenerate_item_ids</tt> is set to false.
8
8
  # The id can also be explicitely specified by setting the id in the html-options of the 'item' method in the config/navigation.rb file.
9
- # The ItemContainer's dom_class and dom_id are applied to the surrounding <div> element.
9
+ # The ItemContainer's dom_attributes are applied to the surrounding <div> element.
10
10
  #
11
11
  class Breadcrumbs < SimpleNavigation::Renderer::Base
12
12
 
@@ -14,7 +14,7 @@ module SimpleNavigation
14
14
  content = a_tags(item_container).join(join_with)
15
15
  content_tag(:div,
16
16
  prefix_for(content) + content,
17
- {:id => item_container.dom_id, :class => item_container.dom_class})
17
+ item_container.dom_attributes)
18
18
  end
19
19
 
20
20
  protected
@@ -8,14 +8,14 @@ module SimpleNavigation
8
8
  #
9
9
  # By default, the renderer sets the item's key as dom_id for the rendered <a> element unless the config option <tt>autogenerate_item_ids</tt> is set to false.
10
10
  # The id can also be explicitely specified by setting the id in the html-options of the 'item' method in the config/navigation.rb file.
11
- # The ItemContainer's dom_class and dom_id are applied to the surrounding <div> element.
11
+ # The ItemContainer's dom_attributes are applied to the surrounding <div> element.
12
12
  #
13
13
  class Links < SimpleNavigation::Renderer::Base
14
14
  def render(item_container)
15
15
  div_content = item_container.items.inject([]) do |list, item|
16
16
  list << tag_for(item)
17
17
  end.join(join_with)
18
- content_tag(:div, div_content, {:id => item_container.dom_id, :class => item_container.dom_class})
18
+ content_tag(:div, div_content, item_container.dom_attributes)
19
19
  end
20
20
 
21
21
  protected
@@ -21,7 +21,7 @@ module SimpleNavigation
21
21
  if skip_if_empty? && item_container.empty?
22
22
  ''
23
23
  else
24
- content_tag((options[:ordered] ? :ol : :ul), list_content, {:id => item_container.dom_id, :class => item_container.dom_class})
24
+ content_tag((options[:ordered] ? :ol : :ul), list_content, item_container.dom_attributes)
25
25
  end
26
26
  end
27
27
  end
@@ -0,0 +1,3 @@
1
+ module SimpleNavigation
2
+ VERSION = '3.12.0'
3
+ end
@@ -3,6 +3,7 @@ require 'active_support/core_ext/array'
3
3
  require 'active_support/core_ext/hash'
4
4
  require 'active_support/core_ext/module/attribute_accessors'
5
5
 
6
+ require 'simple_navigation/version'
6
7
  require 'simple_navigation/core'
7
8
  require 'simple_navigation/rendering'
8
9
  require 'simple_navigation/adapters'
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'simple_navigation/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'simple-navigation'
8
+ spec.version = SimpleNavigation::VERSION
9
+ spec.authors = ['Andi Schacke', 'Mark J. Titorenko']
10
+ spec.email = ['andi@codeplant.ch']
11
+ spec.description = "With the simple-navigation gem installed you can easily " \
12
+ "create multilevel navigations for your Rails, Sinatra or "\
13
+ "Padrino applications. The navigation is defined in a " \
14
+ "single configuration file. It supports automatic as well "\
15
+ "as explicit highlighting of the currently active " \
16
+ "navigation through regular expressions."
17
+ spec.summary = "simple-navigation is a ruby library for creating navigations "\
18
+ "(with multiple levels) for your Rails2, Rails3, Rails4, Sinatra or " \
19
+ "Padrino application."
20
+ spec.homepage = 'http://github.com/codeplant/simple-navigation'
21
+ spec.license = 'MIT'
22
+
23
+ spec.files = `git ls-files -z`.split("\x0")
24
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
26
+ spec.require_paths = ['lib']
27
+
28
+ spec.rdoc_options = ['--inline-source', '--charset=UTF-8']
29
+
30
+ spec.add_runtime_dependency 'activesupport', '>= 2.3.2'
31
+
32
+ spec.add_development_dependency 'actionpack', '>= 2.3.2'
33
+ spec.add_development_dependency 'bundler', '~> 1.5'
34
+ spec.add_development_dependency 'coveralls', '~> 0.7'
35
+ spec.add_development_dependency 'guard-rspec', '~> 4.2'
36
+ spec.add_development_dependency 'json_spec', '~> 1.1'
37
+ spec.add_development_dependency 'rake'
38
+ spec.add_development_dependency 'rdoc'
39
+ spec.add_development_dependency 'rspec', '~> 2.0'
40
+ end
@@ -0,0 +1,13 @@
1
+ RSpec::Matchers.define :have_css do |expected, times|
2
+ match do |actual|
3
+ HTML::Selector.new(expected).select(actual).should have_at_least(times || 1).entry
4
+ end
5
+
6
+ failure_message_for_should do |actual|
7
+ "expected #{actual.to_s} to have #{times || 1} elements matching '#{expected}'"
8
+ end
9
+
10
+ failure_message_for_should_not do |actual|
11
+ "expected #{actual.to_s} not to have #{times || 1} elements matching '#{expected}'"
12
+ end
13
+ end
@@ -1,31 +1,29 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe SimpleNavigation::Adapters::Padrino do
3
+ module SimpleNavigation
4
+ module Adapters
5
+ describe Padrino do
6
+ let(:adapter) { SimpleNavigation::Adapters::Padrino.new(context) }
7
+ let(:content) { double(:content) }
8
+ let(:context) { double(:context, request: request) }
9
+ let(:request) { double(:request) }
4
10
 
5
- def create_adapter
6
- SimpleNavigation::Adapters::Padrino.new(@context)
7
- end
8
-
9
- before(:each) do
10
- @request = stub(:request)
11
- @content = stub(:content)
12
- @context = stub(:context, :request => @request)
13
- @adapter = create_adapter
14
- end
15
-
16
- describe 'link_to' do
17
- it "should delegate to context" do
18
- @context.should_receive(:link_to).with('name', 'url', :my_option => true)
19
- @adapter.link_to('name', 'url', :my_option => true)
20
- end
21
- end
22
-
23
- describe 'content_tag' do
24
- it "should delegate to context" do
25
- @content.should_receive(:html_safe).and_return('content')
26
- @context.should_receive(:content_tag).with('type', 'content', :my_option => true)
27
- @adapter.content_tag('type', @content, :my_option => true)
11
+ describe '#link_to' do
12
+ it 'delegates to context' do
13
+ expect(context).to receive(:link_to)
14
+ .with('name', 'url', :my_option => true)
15
+ adapter.link_to('name', 'url', :my_option => true)
16
+ end
17
+ end
18
+
19
+ describe '#content_tag' do
20
+ it 'delegates to context' do
21
+ expect(content).to receive(:html_safe).and_return('content')
22
+ expect(context).to receive(:content_tag)
23
+ .with('type', 'content', my_option: true)
24
+ adapter.content_tag('type', content, my_option: true)
25
+ end
26
+ end
28
27
  end
29
28
  end
30
-
31
29
  end