loaf 0.6.2 → 0.10.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 (87) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +67 -12
  3. data/LICENSE.txt +1 -1
  4. data/README.md +82 -39
  5. data/lib/loaf.rb +1 -0
  6. data/lib/loaf/configuration.rb +0 -12
  7. data/lib/loaf/controller_extensions.rb +9 -1
  8. data/lib/loaf/errors.rb +1 -1
  9. data/lib/loaf/translation.rb +12 -4
  10. data/lib/loaf/version.rb +3 -1
  11. data/lib/loaf/view_extensions.rb +16 -8
  12. metadata +19 -161
  13. data/.document +0 -5
  14. data/.gitignore +0 -23
  15. data/.rspec +0 -2
  16. data/.travis.yml +0 -48
  17. data/Appraisals +0 -36
  18. data/Gemfile +0 -19
  19. data/Gemfile.lock +0 -185
  20. data/Rakefile +0 -10
  21. data/assets/loaf_logo.png +0 -0
  22. data/bin/appraisal +0 -16
  23. data/bin/rake +0 -16
  24. data/bin/setup +0 -7
  25. data/gemfiles/rails3.2.gemfile +0 -24
  26. data/gemfiles/rails4.0.gemfile +0 -24
  27. data/gemfiles/rails4.1.gemfile +0 -23
  28. data/gemfiles/rails4.2.gemfile +0 -23
  29. data/gemfiles/rails5.0.gemfile +0 -22
  30. data/gemfiles/rails5.1.gemfile +0 -22
  31. data/lib/loaf/crumb_formatter.rb +0 -24
  32. data/loaf.gemspec +0 -28
  33. data/spec/integration/breadcrumb_trail_spec.rb +0 -60
  34. data/spec/integration/configuration_spec.rb +0 -12
  35. data/spec/rails_app/Rakefile +0 -8
  36. data/spec/rails_app/app/controllers/application_controller.rb +0 -5
  37. data/spec/rails_app/app/controllers/comments_controller.rb +0 -17
  38. data/spec/rails_app/app/controllers/home_controller.rb +0 -4
  39. data/spec/rails_app/app/controllers/posts_controller.rb +0 -20
  40. data/spec/rails_app/app/views/comments/index.html.erb +0 -1
  41. data/spec/rails_app/app/views/home/index.html.erb +0 -1
  42. data/spec/rails_app/app/views/layouts/_breadcrumbs.html.erb +0 -12
  43. data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
  44. data/spec/rails_app/app/views/posts/index.html.erb +0 -1
  45. data/spec/rails_app/app/views/posts/new.html.erb +0 -4
  46. data/spec/rails_app/app/views/posts/show.html.erb +0 -1
  47. data/spec/rails_app/config.ru +0 -4
  48. data/spec/rails_app/config/application.rb +0 -48
  49. data/spec/rails_app/config/boot.rb +0 -10
  50. data/spec/rails_app/config/database.yml +0 -25
  51. data/spec/rails_app/config/environment.rb +0 -5
  52. data/spec/rails_app/config/environments/development.rb +0 -32
  53. data/spec/rails_app/config/environments/production.rb +0 -62
  54. data/spec/rails_app/config/environments/test.rb +0 -41
  55. data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  56. data/spec/rails_app/config/initializers/inflections.rb +0 -10
  57. data/spec/rails_app/config/initializers/mime_types.rb +0 -5
  58. data/spec/rails_app/config/initializers/secret_token.rb +0 -7
  59. data/spec/rails_app/config/initializers/session_store.rb +0 -8
  60. data/spec/rails_app/config/initializers/wrap_parameters.rb +0 -14
  61. data/spec/rails_app/config/locales/en.yml +0 -5
  62. data/spec/rails_app/config/locales/loaf.en.yml +0 -6
  63. data/spec/rails_app/config/routes.rb +0 -7
  64. data/spec/rails_app/config/secrets.yml +0 -22
  65. data/spec/rails_app/public/404.html +0 -26
  66. data/spec/rails_app/public/422.html +0 -26
  67. data/spec/rails_app/public/500.html +0 -26
  68. data/spec/rails_app/public/favicon.ico +0 -0
  69. data/spec/rails_app/public/robots.txt +0 -5
  70. data/spec/spec_helper.rb +0 -52
  71. data/spec/support/capybara.rb +0 -8
  72. data/spec/support/dummy_controller.rb +0 -9
  73. data/spec/support/dummy_view.rb +0 -47
  74. data/spec/support/load_routes.rb +0 -4
  75. data/spec/unit/configuration_spec.rb +0 -39
  76. data/spec/unit/controller_extensions_spec.rb +0 -54
  77. data/spec/unit/crumb_formatter_spec.rb +0 -36
  78. data/spec/unit/crumb_spec.rb +0 -15
  79. data/spec/unit/generators/install_generator_spec.rb +0 -17
  80. data/spec/unit/options_validator_spec.rb +0 -15
  81. data/spec/unit/translation_spec.rb +0 -22
  82. data/spec/unit/view_extensions/breadcrumb_spec.rb +0 -22
  83. data/spec/unit/view_extensions/breadcrumb_trail_spec.rb +0 -232
  84. data/spec/unit/view_extensions/has_breadcrumbs_spec.rb +0 -10
  85. data/tasks/console.rake +0 -10
  86. data/tasks/coverage.rake +0 -11
  87. data/tasks/spec.rake +0 -29
@@ -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?(crumb_length: 10)).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,22 +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 'translates breadcrumb title' do
10
- I18n.backend.store_translations 'en', loaf: { breadcrumbs: { home: 'Home'}}
11
- expect(described_class.find_title('home')).to eql('Home')
12
- end
13
-
14
- it 'does not translates breadcrumb name with missing scope' do
15
- I18n.backend.store_translations 'en', breadcrumbs: {home: 'Home'}
16
- expect(described_class.find_title('home')).to eql('home')
17
- end
18
-
19
- it 'translates breadcrumb name using default option' do
20
- expect(described_class.find_title('home', default: 'breadcrumb default name')).to eql('breadcrumb default name')
21
- end
22
- 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,232 +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 'uses global configuration for crumb formatting' do
200
- allow(Loaf.configuration).to receive(:crumb_length).and_return(10)
201
- view = DummyView.new
202
- view.breadcrumb('home-sweet-home', :home_path)
203
- view.breadcrumb('posts-for-everybody', :posts_path)
204
- view.set_path('/posts')
205
-
206
- yielded = []
207
- block = -> (crumb) { yielded << crumb.to_a }
208
- view.breadcrumb_trail(&block)
209
-
210
- expect(yielded).to eq([
211
- ['home-sw...', '/', false],
212
- ['posts-f...', '/posts', true]
213
- ])
214
- end
215
-
216
- it "allows to overwrite global configuration" do
217
- allow(Loaf.configuration).to receive(:crumb_length).and_return(10)
218
- view = DummyView.new
219
- view.breadcrumb('home-sweet-home', :home_path)
220
- view.breadcrumb('posts-for-everybody', :posts_path)
221
- view.set_path('/posts')
222
-
223
- yielded = []
224
- block = -> (crumb) { yielded << crumb.to_a }
225
- view.breadcrumb_trail(crumb_length: 15, &block)
226
-
227
- expect(yielded).to eq([
228
- ['home-sweet-home', '/', false],
229
- ['posts-for-ev...', '/posts', true]
230
- ])
231
- end
232
- end
@@ -1,10 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe Loaf::ViewExtensions, '.breadcrumb?' do
4
- it 'checks for breadcrumbs existance' do
5
- instance = DummyView.new
6
- expect(instance.breadcrumbs?).to eq(false)
7
- instance.breadcrumb 'Home', :home_path
8
- expect(instance.breadcrumbs?).to eq(true)
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- # encoding: utf-8
2
-
3
- desc 'Load gem inside irb console'
4
- task :console do
5
- require 'irb'
6
- require 'irb/completion'
7
- require File.join(__FILE__, '../../lib/loaf')
8
- ARGV.clear
9
- IRB.start
10
- end
@@ -1,11 +0,0 @@
1
- # encoding: utf-8
2
-
3
- desc 'Measure code coverage'
4
- task :coverage do
5
- begin
6
- original, ENV['COVERAGE'] = ENV['COVERAGE'], 'true'
7
- Rake::Task['spec'].invoke
8
- ensure
9
- ENV['COVERAGE'] = original
10
- end
11
- end
@@ -1,29 +0,0 @@
1
- # encoding: utf-8
2
-
3
- begin
4
- require 'rspec/core/rake_task'
5
-
6
- desc 'Run all specs'
7
- RSpec::Core::RakeTask.new(:spec) do |task|
8
- task.pattern = 'spec/{unit,integration}{,/*/**}/*_spec.rb'
9
- end
10
-
11
- namespace :spec do
12
- desc 'Run unit specs'
13
- RSpec::Core::RakeTask.new(:unit) do |task|
14
- task.pattern = 'spec/unit{,/*/**}/*_spec.rb'
15
- end
16
-
17
- desc 'Run integration specs'
18
- RSpec::Core::RakeTask.new(:integration) do |task|
19
- task.pattern = 'spec/integration{,/*/**}/*_spec.rb'
20
- end
21
- end
22
-
23
- rescue LoadError
24
- %w[spec spec:unit spec:integration].each do |name|
25
- task name do
26
- $stderr.puts "In order to run #{name}, do `gem install rspec`"
27
- end
28
- end
29
- end