loaf 0.8.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +9 -1
  4. data/lib/loaf.rb +1 -0
  5. data/lib/loaf/errors.rb +1 -1
  6. data/lib/loaf/translation.rb +1 -1
  7. data/lib/loaf/version.rb +1 -1
  8. metadata +13 -70
  9. data/Appraisals +0 -31
  10. data/Rakefile +0 -13
  11. data/bin/console +0 -14
  12. data/bin/setup +0 -9
  13. data/loaf.gemspec +0 -35
  14. data/spec/integration/breadcrumb_trail_spec.rb +0 -71
  15. data/spec/integration/configuration_spec.rb +0 -12
  16. data/spec/rails_app/Rakefile +0 -8
  17. data/spec/rails_app/app/controllers/application_controller.rb +0 -5
  18. data/spec/rails_app/app/controllers/comments_controller.rb +0 -20
  19. data/spec/rails_app/app/controllers/home_controller.rb +0 -4
  20. data/spec/rails_app/app/controllers/posts_controller.rb +0 -20
  21. data/spec/rails_app/app/views/comments/index.html.erb +0 -1
  22. data/spec/rails_app/app/views/home/index.html.erb +0 -1
  23. data/spec/rails_app/app/views/layouts/_breadcrumbs.html.erb +0 -12
  24. data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
  25. data/spec/rails_app/app/views/posts/index.html.erb +0 -1
  26. data/spec/rails_app/app/views/posts/new.html.erb +0 -4
  27. data/spec/rails_app/app/views/posts/show.html.erb +0 -1
  28. data/spec/rails_app/config.ru +0 -4
  29. data/spec/rails_app/config/application.rb +0 -48
  30. data/spec/rails_app/config/boot.rb +0 -10
  31. data/spec/rails_app/config/database.yml +0 -25
  32. data/spec/rails_app/config/environment.rb +0 -5
  33. data/spec/rails_app/config/environments/development.rb +0 -32
  34. data/spec/rails_app/config/environments/production.rb +0 -62
  35. data/spec/rails_app/config/environments/test.rb +0 -41
  36. data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  37. data/spec/rails_app/config/initializers/inflections.rb +0 -10
  38. data/spec/rails_app/config/initializers/mime_types.rb +0 -5
  39. data/spec/rails_app/config/initializers/secret_token.rb +0 -7
  40. data/spec/rails_app/config/initializers/session_store.rb +0 -8
  41. data/spec/rails_app/config/initializers/wrap_parameters.rb +0 -14
  42. data/spec/rails_app/config/locales/en.yml +0 -5
  43. data/spec/rails_app/config/locales/loaf.en.yml +0 -6
  44. data/spec/rails_app/config/routes.rb +0 -7
  45. data/spec/rails_app/config/secrets.yml +0 -22
  46. data/spec/rails_app/db/seeds.rb +0 -7
  47. data/spec/rails_app/public/404.html +0 -26
  48. data/spec/rails_app/public/422.html +0 -26
  49. data/spec/rails_app/public/500.html +0 -26
  50. data/spec/rails_app/public/favicon.ico +0 -0
  51. data/spec/rails_app/public/robots.txt +0 -5
  52. data/spec/spec_helper.rb +0 -52
  53. data/spec/support/capybara.rb +0 -8
  54. data/spec/support/dummy_controller.rb +0 -9
  55. data/spec/support/dummy_view.rb +0 -47
  56. data/spec/support/load_routes.rb +0 -4
  57. data/spec/unit/configuration_spec.rb +0 -33
  58. data/spec/unit/controller_extensions_spec.rb +0 -54
  59. data/spec/unit/crumb_spec.rb +0 -15
  60. data/spec/unit/generators/install_generator_spec.rb +0 -17
  61. data/spec/unit/options_validator_spec.rb +0 -15
  62. data/spec/unit/translation_spec.rb +0 -30
  63. data/spec/unit/view_extensions/breadcrumb_spec.rb +0 -22
  64. data/spec/unit/view_extensions/breadcrumb_trail_spec.rb +0 -244
  65. data/spec/unit/view_extensions/has_breadcrumbs_spec.rb +0 -10
  66. data/tasks/console.rake +0 -10
  67. data/tasks/coverage.rake +0 -11
  68. data/tasks/spec.rake +0 -29
@@ -1,26 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>The change you wanted was rejected (422)</title>
5
- <style type="text/css">
6
- body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
- div.dialog {
8
- width: 25em;
9
- padding: 0 4em;
10
- margin: 4em auto 0 auto;
11
- border: 1px solid #ccc;
12
- border-right-color: #999;
13
- border-bottom-color: #999;
14
- }
15
- h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <!-- This file lives in public/422.html -->
21
- <div class="dialog">
22
- <h1>The change you wanted was rejected.</h1>
23
- <p>Maybe you tried to change something you didn't have access to.</p>
24
- </div>
25
- </body>
26
- </html>
@@ -1,26 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>We're sorry, but something went wrong (500)</title>
5
- <style type="text/css">
6
- body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
- div.dialog {
8
- width: 25em;
9
- padding: 0 4em;
10
- margin: 4em auto 0 auto;
11
- border: 1px solid #ccc;
12
- border-right-color: #999;
13
- border-bottom-color: #999;
14
- }
15
- h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <!-- This file lives in public/500.html -->
21
- <div class="dialog">
22
- <h1>We're sorry, but something went wrong.</h1>
23
- <p>We've been notified about this issue and we'll take a look at it shortly.</p>
24
- </div>
25
- </body>
26
- </html>
File without changes
@@ -1,5 +0,0 @@
1
- # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
- #
3
- # To ban all spiders from the entire site uncomment the next two lines:
4
- # User-Agent: *
5
- # Disallow: /
@@ -1,52 +0,0 @@
1
- # encoding: utf-8
2
-
3
- if (ENV['COVERAGE'] || ENV['TRAVIS']) && RUBY_VERSION < '2.4.0'
4
- require 'simplecov'
5
- require 'coveralls'
6
-
7
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
8
- SimpleCov::Formatter::HTMLFormatter,
9
- Coveralls::SimpleCov::Formatter
10
- ])
11
-
12
- SimpleCov.start do
13
- command_name 'spec'
14
- add_filter 'spec'
15
- end
16
- end
17
-
18
- # Configure Rails Environment
19
- ENV["RAILS_ENV"] = "test"
20
-
21
- require 'rails_app/config/environment.rb'
22
- require 'rspec/rails'
23
- require 'loaf'
24
-
25
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
26
-
27
- RSpec.configure do |config|
28
- config.expect_with :rspec do |expectations|
29
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
30
- end
31
-
32
- config.mock_with :rspec do |mocks|
33
- mocks.verify_partial_doubles = true
34
- end
35
-
36
- # Limits the available syntax to the non-monkey patched syntax that is recommended.
37
- config.disable_monkey_patching!
38
-
39
- # This setting enables warnings. It's recommended, but in some cases may
40
- # be too noisy due to issues in dependencies.
41
- config.warnings = true
42
-
43
- if config.files_to_run.one?
44
- config.default_formatter = 'doc'
45
- end
46
-
47
- config.profile_examples = 2
48
-
49
- config.order = :random
50
-
51
- Kernel.srand config.seed
52
- end
@@ -1,8 +0,0 @@
1
- require 'capybara/rails'
2
- require 'capybara/dsl'
3
-
4
- RSpec.configure do |c|
5
- c.include Capybara::DSL, :file_path => /\bspec\/integration\//
6
- end
7
- Capybara.default_driver = :rack_test
8
- Capybara.default_selector = :css
@@ -1,9 +0,0 @@
1
- class DummyController < ActionController::Base
2
- def self.before_filter(options, &block)
3
- yield self.new
4
- end
5
- class << self
6
- alias before_action before_filter
7
- end
8
- include Loaf::ControllerExtensions
9
- end
@@ -1,47 +0,0 @@
1
- require 'action_view'
2
-
3
- class DummyView < ActionView::Base
4
- module FakeRequest
5
- class Request
6
- attr_accessor :path, :fullpath, :protocol, :host_with_port
7
- def get?
8
- true
9
- end
10
- end
11
- def request
12
- @request ||= Request.new
13
- end
14
- def params
15
- @params ||= {}
16
- end
17
- end
18
-
19
- include FakeRequest
20
- include ActionView::Helpers::UrlHelper
21
- include Loaf::ViewExtensions
22
-
23
- attr_reader :_breadcrumbs
24
-
25
- routes = ActionDispatch::Routing::RouteSet.new
26
- routes.draw do
27
- get "/" => "foo#bar", :as => :home
28
- get "/posts" => "foo#posts"
29
- get "/posts/:title" => "foo#posts"
30
- get "/post/:id" => "foo#post", :as => :post
31
- get "/post/:title" => "foo#title"
32
- get "/post/:id/comments" => "foo#comments"
33
-
34
- namespace :blog do
35
- get "/" => "foo#bar"
36
- end
37
- end
38
-
39
- include routes.url_helpers
40
-
41
- def set_path(path)
42
- request.path = path
43
- request.fullpath = path
44
- request.protocol = 'http://'
45
- request.host_with_port = 'www.example.com'
46
- end
47
- end
@@ -1,4 +0,0 @@
1
- RSpec.configure do |c|
2
- c.include Rails.application.routes.url_helpers,
3
- :file_path => /\bspec\/integration\//
4
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Loaf::Configuration do
4
- it "allows to set and read attributes" do
5
- config = Loaf::Configuration.new
6
- config.match = :exact
7
- expect(config.match).to eq(:exact)
8
- end
9
-
10
- it "accepts attributes at initialization" do
11
- options = { locales_path: '/lib', match: :exact }
12
- config = Loaf::Configuration.new(options)
13
-
14
- expect(config.locales_path).to eq('/lib')
15
- expect(config.match).to eq(:exact)
16
- end
17
-
18
- it "exports configuration as hash" do
19
- config = Loaf::Configuration.new
20
- expect(config.to_hash).to eq({
21
- locales_path: '/',
22
- match: :inclusive
23
- })
24
- end
25
-
26
- it "yields configuration" do
27
- conf = double(:conf)
28
- allow(Loaf).to receive(:configuration).and_return(conf)
29
- expect { |b|
30
- Loaf.configure(&b)
31
- }.to yield_with_args(conf)
32
- end
33
- end
@@ -1,54 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe Loaf::ControllerExtensions do
4
-
5
- context 'when classes extend controller_extensions' do
6
- it { expect(DummyController).to respond_to(:add_breadcrumb) }
7
- it { expect(DummyController).to respond_to(:breadcrumb) }
8
- it { expect(DummyController.new).to respond_to(:add_breadcrumb) }
9
- it { expect(DummyController.new).to respond_to(:breadcrumb) }
10
- it { expect(DummyController.new).to respond_to(:clear_breadcrumbs) }
11
- end
12
-
13
- context 'class methods' do
14
- it 'invokes before_action' do
15
- allow(DummyController).to receive(:before_action)
16
- allow(DummyController).to receive(:respond_to?).and_return(true)
17
- DummyController.breadcrumb('name', 'url_path')
18
- expect(DummyController).to have_received(:before_action)
19
- end
20
-
21
- it 'delegates breadcrumb registration to controller instance' do
22
- name = 'List objects'
23
- url = :object_path
24
- options = {force: true}
25
- instance = double(:controller_instance).as_null_object
26
-
27
- allow(DummyController).to receive(:new).and_return(instance)
28
- DummyController.breadcrumb(name, url, options)
29
- expect(instance).to have_received(:breadcrumb).with(name, url, options)
30
- end
31
- end
32
-
33
- context 'instance methods' do
34
- it 'instantiates breadcrumbs container' do
35
- name = 'List objects'
36
- url = :object_path
37
- instance = DummyController.new
38
-
39
- allow(Loaf::Crumb).to receive(:new)
40
- instance.breadcrumb(name, url)
41
- expect(Loaf::Crumb).to have_received(:new).with(name, url, {})
42
- end
43
-
44
- it 'adds breadcrumb to collection' do
45
- name = 'List objects'
46
- url = :object_path
47
- instance = DummyController.new
48
-
49
- expect {
50
- instance.breadcrumb(name, url)
51
- }.to change { instance._breadcrumbs.size }.by(1)
52
- end
53
- end
54
- end
@@ -1,15 +0,0 @@
1
- RSpec.describe Loaf::Crumb do
2
- it "fails when name is nil" do
3
- expect {
4
- Loaf::Crumb.new(nil, 'path')
5
- }.to raise_error(ArgumentError,
6
- /breadcrumb first argument, `name`, cannot be nil/)
7
- end
8
-
9
- it "fails when url is nil" do
10
- expect {
11
- Loaf::Crumb.new('name', nil)
12
- }.to raise_error(ArgumentError,
13
- /breadcrumb second argument, `url`, cannot be nil/)
14
- end
15
- end
@@ -1,17 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'fileutils'
4
- require 'generators/loaf/install_generator'
5
-
6
- RSpec.describe Loaf::Generators::InstallGenerator, type: :generator do
7
- destination File.expand_path("../../../tmp", __FILE__)
8
-
9
- before { prepare_destination }
10
-
11
- it "copies loaf locales to the host application" do
12
- run_generator
13
- locale = file("config/locales/loaf.en.yml")
14
- expect(locale).to exist
15
- FileUtils.rm_rf(File.expand_path("../../../tmp", __FILE__))
16
- end
17
- end
@@ -1,15 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe Loaf::OptionsValidator, '.valid?' do
4
- let(:klass) { Class.extend Loaf::OptionsValidator }
5
-
6
- it 'validates succesfully known option' do
7
- expect(klass.valid?(match: :exact)).to eq(true)
8
- end
9
-
10
- it 'validates unknown option with an error' do
11
- expect {
12
- klass.valid?(invalid_param: true)
13
- }.to raise_error(Loaf::InvalidOptions)
14
- end
15
- end
@@ -1,30 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe Loaf::Translation do
4
-
5
- before { I18n.backend = I18n::Backend::Simple.new }
6
-
7
- after { I18n.backend.reload! }
8
-
9
- it "doesn't translate empty title" do
10
- expect(described_class.find_title('')).to eql('')
11
- end
12
-
13
- it "skips translation if doesn't find a matching scope" do
14
- expect(described_class.find_title('unknown')).to eql('unknown')
15
- end
16
-
17
- it 'translates breadcrumb title' do
18
- I18n.backend.store_translations 'en', loaf: { breadcrumbs: { home: 'Home'}}
19
- expect(described_class.find_title('home')).to eql('Home')
20
- end
21
-
22
- it 'does not translates breadcrumb name with missing scope' do
23
- I18n.backend.store_translations 'en', breadcrumbs: {home: 'Home'}
24
- expect(described_class.find_title('home')).to eql('home')
25
- end
26
-
27
- it 'translates breadcrumb name using default option' do
28
- expect(described_class.find_title('home', default: 'breadcrumb default name')).to eql('breadcrumb default name')
29
- end
30
- end
@@ -1,22 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe Loaf::ViewExtensions, '.breadcrumb' do
4
-
5
- it { expect(DummyView.new).to respond_to(:add_breadcrumb) }
6
-
7
- it 'creates crumb instance' do
8
- instance = DummyView.new
9
- name = 'Home'
10
- url = :home_path
11
- allow(Loaf::Crumb).to receive(:new).with(name, url, {})
12
- instance.breadcrumb name, url
13
- expect(Loaf::Crumb).to have_received(:new).with(name, url, {})
14
- end
15
-
16
- it 'adds crumb to breadcrumbs storage' do
17
- instance = DummyView.new
18
- expect {
19
- instance.breadcrumb 'Home', :home_path
20
- }.to change { instance._breadcrumbs.size }.by(1)
21
- end
22
- end
@@ -1,244 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe Loaf::ViewExtensions, '#breadcrumb_trail' do
4
- it "resolves breadcrumb paths" do
5
- view = DummyView.new
6
- view.breadcrumb('home', :home_path)
7
- view.breadcrumb('posts', :posts_path)
8
- view.set_path('/posts')
9
-
10
- yielded = []
11
- block = -> (crumb) { yielded << crumb.to_a }
12
- view.breadcrumb_trail(&block)
13
-
14
- expect(yielded).to eq([
15
- ['home', '/', false],
16
- ['posts', '/posts', true]
17
- ])
18
- end
19
-
20
- it "matches current path with :inclusive option as default" do
21
- view = DummyView.new
22
- view.breadcrumb('home', :home_path)
23
- view.breadcrumb('posts', :posts_path)
24
- view.set_path('/posts?id=73-title')
25
-
26
- yielded = []
27
- block = -> (crumb) { yielded << crumb.to_a }
28
- view.breadcrumb_trail(&block)
29
-
30
- expect(yielded).to eq([
31
- ['home', '/', false],
32
- ['posts', '/posts', true]
33
- ])
34
- end
35
-
36
- it "matches current path with :inclusive when query params" do
37
- view = DummyView.new
38
- view.breadcrumb('posts', '/posts', match: :inclusive)
39
- view.set_path('/posts?foo=bar')
40
-
41
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', true]])
42
- end
43
-
44
- it "matches current path with :inclusive when nested" do
45
- view = DummyView.new
46
- view.breadcrumb('posts', '/posts', match: :inclusive)
47
- view.set_path('/posts/1/comment')
48
-
49
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', true]])
50
- end
51
-
52
- it "matches current path with :inclusive when nested" do
53
- view = DummyView.new
54
- view.breadcrumb('posts', '/posts', match: :inclusive)
55
- view.set_path('/posts/1/comment')
56
-
57
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', true]])
58
- end
59
-
60
- it "doesn't match with :inclusive when unrelated path" do
61
- view = DummyView.new
62
- view.breadcrumb('posts', '/posts', match: :inclusive)
63
- view.set_path('/post/1')
64
-
65
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', false]])
66
- end
67
-
68
- it "matches current path with :inclusive when extra trailing slash" do
69
- view = DummyView.new
70
- view.breadcrumb('posts', '/posts/', match: :inclusive)
71
- view.set_path('/posts')
72
-
73
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts/', true]])
74
- end
75
-
76
- it "matches current path with :inclusive when absolute path" do
77
- view = DummyView.new
78
- view.breadcrumb('posts', 'http://www.example.com/posts/', match: :inclusive)
79
- view.set_path('/posts')
80
-
81
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([
82
- ['posts', 'http://www.example.com/posts/', true]
83
- ])
84
- end
85
-
86
- it "matches current path with :exact when trailing slash" do
87
- view = DummyView.new
88
- view.breadcrumb('posts', '/posts/', match: :exact)
89
- view.set_path('/posts')
90
-
91
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts/', true]])
92
- end
93
-
94
- it "fails to match current path with :exact when nested" do
95
- view = DummyView.new
96
- view.breadcrumb('posts', '/posts', match: :exact)
97
- view.set_path('/posts/1/comment')
98
-
99
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', false]])
100
- end
101
-
102
- it "fails to match current path with :exact when query params" do
103
- view = DummyView.new
104
- view.breadcrumb('posts', '/posts', match: :exact)
105
- view.set_path('/posts?foo=bar')
106
-
107
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', false]])
108
- end
109
-
110
- it "matches current path with :exclusive option when query params" do
111
- view = DummyView.new
112
- view.breadcrumb('posts', '/posts', match: :exclusive)
113
- view.set_path('/posts?foo=bar')
114
-
115
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', true]])
116
- end
117
-
118
- it "fails to match current path with :exclusive option when nested" do
119
- view = DummyView.new
120
- view.breadcrumb('posts', '/posts', match: :exclusive)
121
- view.set_path('/posts/1/comment')
122
-
123
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', false]])
124
- end
125
-
126
- it "matches current path with regex option when query params" do
127
- view = DummyView.new
128
- view.breadcrumb('posts', '/posts', match: %r{/po})
129
- view.set_path('/posts?foo=bar')
130
-
131
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', true]])
132
- end
133
-
134
- it "matches current path with query params option" do
135
- view = DummyView.new
136
- view.breadcrumb('posts', '/posts', match: {foo: :bar})
137
- view.set_path('/posts?foo=bar&baz=boo')
138
-
139
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', true]])
140
- end
141
-
142
- it "fails to match current path with query params option" do
143
- view = DummyView.new
144
- view.breadcrumb('posts', '/posts', match: {foo: :bar})
145
- view.set_path('/posts?foo=2&baz=boo')
146
-
147
- expect(view.breadcrumb_trail.map(&:to_a)).to eq([['posts', '/posts', false]])
148
- end
149
-
150
- it "failse to recognize the match option" do
151
- view = DummyView.new
152
- view.breadcrumb('posts', 'http://www.example.com/posts/', match: :boom)
153
- view.set_path('/posts')
154
- block = -> (*args) { }
155
- expect {
156
- view.breadcrumb_trail(&block)
157
- }.to raise_error(ArgumentError, "Unknown `:boom` match option!")
158
- end
159
-
160
- it "forces current path" do
161
- view = DummyView.new
162
- view.breadcrumb('home', :home_path)
163
- view.breadcrumb('posts', :posts_path, match: :force)
164
- view.set_path('/')
165
-
166
- yielded = []
167
- block = -> (crumb) { yielded << crumb.to_a }
168
- view.breadcrumb_trail(&block)
169
-
170
- expect(yielded).to eq([
171
- ['home', '/', true],
172
- ['posts', '/posts', true]
173
- ])
174
- end
175
-
176
- it "returns enumerator without block" do
177
- view = DummyView.new
178
- view.breadcrumb('home', :home_path)
179
- view.breadcrumb('posts', :posts_path)
180
- view.set_path('/posts')
181
-
182
- result = view.breadcrumb_trail
183
-
184
- expect(result).to be_a(Enumerable)
185
- expect(result.take(2).map(&:to_a)).to eq([
186
- ['home', '/', false],
187
- ['posts', '/posts', true]
188
- ])
189
- end
190
-
191
- it 'validates passed options' do
192
- view = DummyView.new
193
- block = -> (name, url, styles) { }
194
- expect {
195
- view.breadcrumb_trail(unknown: true, &block)
196
- }.to raise_error(Loaf::InvalidOptions)
197
- end
198
-
199
- it "permits arbitrary length crumb names" do
200
- view = DummyView.new
201
- view.breadcrumb('<span class="fa fa-home"></span>', :home_path)
202
- view.set_path('/posts')
203
-
204
- yielded = []
205
- block = -> (crumb) { yielded << crumb.to_a }
206
- view.breadcrumb_trail(&block)
207
-
208
- expect(yielded).to eq([
209
- ['<span class="fa fa-home"></span>', '/', false]
210
- ])
211
- end
212
-
213
- it 'uses global configuration for crumb formatting' do
214
- view = DummyView.new
215
- view.breadcrumb('home-sweet-home', :home_path)
216
- view.breadcrumb('posts-for-everybody', :posts_path)
217
- view.set_path('/posts')
218
-
219
- yielded = []
220
- block = -> (crumb) { yielded << crumb.to_a }
221
- view.breadcrumb_trail(&block)
222
-
223
- expect(yielded).to eq([
224
- ['home-sweet-home', '/', false],
225
- ['posts-for-everybody', '/posts', true]
226
- ])
227
- end
228
-
229
- it "allows to overwrite global configuration" do
230
- view = DummyView.new
231
- view.breadcrumb('home-sweet-home', :home_path)
232
- view.breadcrumb('posts-for-everybody', :posts_path)
233
- view.set_path('/posts')
234
-
235
- yielded = []
236
- block = -> (crumb) { yielded << crumb.to_a }
237
- view.breadcrumb_trail(match: :exact, &block)
238
-
239
- expect(yielded).to eq([
240
- ['home-sweet-home', '/', false],
241
- ['posts-for-everybody', '/posts', true]
242
- ])
243
- end
244
- end