loaf 0.8.1 → 0.9.0

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.
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