loaf 0.6.2 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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