loaf 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cca72395f0a519e2c8e167a945f0a7aef2904405
4
- data.tar.gz: 073bea2f84cbe624dc1b281eb945607be99ee091
2
+ SHA256:
3
+ metadata.gz: 1345a409b2a725846ac573193095c6a53b398a23e87bcace96c0cc06d0ff1c27
4
+ data.tar.gz: 3f60d6a1921ead6fd51654aa2f3e80fbd85ee53955f9e3aa40cd850fd1d00a86
5
5
  SHA512:
6
- metadata.gz: 1011debf785a3fa61247244b1db86937bba310dfc54621759eca9c1dd2d8e1eb7f6d88a7a67b5a2fd99795c26881cc365306aeb5b6f6ebe6267c7614e64f9731
7
- data.tar.gz: 36daede4d09914f3a488f3dee1c0a1c5250fb0b2b3a8604d77a229d66cb464723d788b075ea553714d25faa7c06dd2a941cbd572e81589ca0e2565ec9ee4fdd6
6
+ metadata.gz: 7689bbb410e7b440ba0a4bec01ad93f17d4d42412913732f530e862c6abed8a4a4519bf0d1064566da2346c798e9c04673edf97c8e3e76543bc21cb7f041adc5
7
+ data.tar.gz: ee103f98f0a5ddde85c4594e3efafeebe76acfc316147524e6922dca990282fc334d626550091eec0a50d0bc14c35b7bdefd08be690001d977b86cbc81584d00
@@ -1,5 +1,16 @@
1
1
  # Change log
2
2
 
3
+ ## [v0.8.0] - 2018-08-07
4
+
5
+ ### Changed
6
+ * Change Translation to skip translating nil and empty string
7
+ * Change view extension to only lookup breadcrumb name translation
8
+ * Remove Configuration #crumb_length and #capitalize options
9
+ * Remove CrumbFormatter to skip truncating and formatting crumb names
10
+
11
+ ## Fix
12
+ * Fix issue with breadcrumb names being modified
13
+
3
14
  ## [v0.7.0] - 2018-06-20
4
15
 
5
16
  ### Added
@@ -67,7 +78,7 @@
67
78
  ### Fixed
68
79
  * Fix bug with url parameter to allow for regular rails path variables
69
80
 
70
- ## [0.3.0] - 2012-02-25
81
+ ## [v0.3.0] - 2012-02-25
71
82
 
72
83
  ### Added
73
84
  * Add loaf gem errors
@@ -78,13 +89,13 @@
78
89
  * Renamed main gem helpers for adding breadcrumbs from `add_breadcrumb` to
79
90
  `breadcrumb`, both inside controllers and views.
80
91
 
81
- ## [0.2.1] - 2012-02-22
92
+ ## [v0.2.1] - 2012-02-22
82
93
 
83
94
  ### Added
84
95
  * Add more integration tests and fixed bug with adding breadcrumbs inside view
85
96
  * Add specs for controller extensions
86
97
 
87
- ## [0.2.0] - 2012-02-18
98
+ ## [v0.2.0] - 2012-02-18
88
99
 
89
100
  ### Added
90
101
  * Add integration tests for breadcrumbs view rendering
@@ -100,6 +111,7 @@
100
111
 
101
112
  * Initial implementation and release
102
113
 
114
+ [v0.8.0]: https://github.com/piotrmurach/tty-spinner/compare/v0.7.0...v0.8.0
103
115
  [v0.7.0]: https://github.com/piotrmurach/tty-spinner/compare/v0.6.2...v0.7.0
104
116
  [v0.6.2]: https://github.com/piotrmurach/tty-spinner/compare/v0.6.1...v0.6.2
105
117
  [v0.6.1]: https://github.com/piotrmurach/tty-spinner/compare/v0.6.0...v0.6.1
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- loaf (0.7.0)
4
+ loaf (0.8.0)
5
5
  rails (>= 3.2)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -163,6 +163,18 @@ class CommentsController < ApplicationController
163
163
  end
164
164
  ```
165
165
 
166
+ You may wish to define breadcrumbs over a collection. This is easy within views, and controller actions (just loop your collection), but if you want to do this in the controller class you can use the `before_action` approach:
167
+
168
+ ```ruby
169
+ before_action do
170
+ ancestors.each do |ancestor|
171
+ breadcrumb ancestor.name, [:admin, ancestor]
172
+ end
173
+ end
174
+ ```
175
+
176
+ Assume `ancestors` method is defined inside the controller.
177
+
166
178
  #### 2.1.2 view
167
179
 
168
180
  **Loaf** adds `breadcrumb` helper also to the views. Together with controller breadcrumbs, the view breadcrumbs are appended as the last in breadcrumb trail. For instance, to specify view breadcrumb do:
@@ -228,9 +240,10 @@ For example, you can add the following semantic markup to show breadcrumbs using
228
240
  </ol>
229
241
  </nav>
230
242
  ```
243
+ For Bootstrap 4:
231
244
 
232
- For bootstrap,
233
245
  ```erb
246
+ <% #erb %>
234
247
  <nav aria-label="breadcrumb">
235
248
  <ol class='breadcrumbs'>
236
249
  <% breadcrumb_trail do |crumb| %>
@@ -242,23 +255,30 @@ For bootstrap,
242
255
  </nav>
243
256
  ```
244
257
 
258
+ and if you are using HAML do:
259
+
260
+ ```haml
261
+ - # haml
262
+ %ol.breadcrumbs
263
+ - breadcrumb_trail do |crumb|
264
+ %li.breadcrumb-item{class: crumb.current? ? 'active' : '' }
265
+ = link_to_unless crumb.current?, crumb.name, crumb.url, (crumb.current? ? {'aria-current' => 'page'} : {})
266
+ ```
245
267
 
246
- Usually best practice is to put such snippet inside its own partial.
268
+ Usually best practice is to put such snippet inside its own `_breadcrumbs.html.erb` partial.
247
269
 
248
270
  ## 3. Configuration
249
271
 
250
272
  There is a small set of custom opinionated defaults. The following options are valid parameters:
251
273
 
252
274
  ```ruby
253
- :capitalize # set breadcrumbs to have initial letter uppercase, default false
254
- :crumb_length # breadcrumb length in integer, default length is 30 characters
255
- :match # set match type, default :inclusive
275
+ :match # set match type, default :inclusive (see [:match](#213-match) for more details)
256
276
  ```
257
277
 
258
278
  You can override them in your views by passing them to the view `breadcrumb` helper
259
279
 
260
280
  ```erb
261
- <% breadcrumb_trail crumb_length: 20 do |name, url, styles| %>
281
+ <% breadcrumb_trail(match: :exclusive) do |name, url, styles| %>
262
282
  ..
263
283
  <% end %>
264
284
  ```
@@ -267,7 +287,7 @@ or by configuring an option in `config/initializers/loaf.rb`:
267
287
 
268
288
  ```ruby
269
289
  Loaf.configure do |config|
270
- config.crumb_length = 20
290
+ config.match = :exclusive
271
291
  end
272
292
  ```
273
293
 
@@ -4,8 +4,6 @@ module Loaf
4
4
  class Configuration
5
5
  VALID_ATTRIBUTES = [
6
6
  :locales_path,
7
- :crumb_length,
8
- :capitalize,
9
7
  :match
10
8
  ].freeze
11
9
 
@@ -13,18 +11,8 @@ module Loaf
13
11
 
14
12
  DEFAULT_LOCALES_PATH = '/'
15
13
 
16
- DEFAULT_STYLE_CLASSES = 'selected'
17
-
18
- DEFAULT_CRUMB_LENGTH = 30
19
-
20
- DEFAULT_LAST_CRUMB_LINKED = false
21
-
22
- DEFAULT_CAPITALIZE = false
23
-
24
14
  DEFAULT_MATCH = :inclusive
25
15
 
26
- DEFAULT_ROOT = true
27
-
28
16
  # Setup this configuration
29
17
  #
30
18
  # @api public
@@ -2,12 +2,15 @@
2
2
 
3
3
  module Loaf
4
4
  module Translation
5
- extend self
6
-
7
5
  # Returns translation lookup
6
+ #
7
+ # @return [String]
8
+ #
9
+ # @api private
8
10
  def translation_scope
9
- "loaf.breadcrumbs"
11
+ 'loaf.breadcrumbs'
10
12
  end
13
+ module_function :translation_scope
11
14
 
12
15
  # Translate breadcrumb title
13
16
  #
@@ -18,12 +21,17 @@ module Loaf
18
21
  # @option options [String] :default
19
22
  # The default translation
20
23
  #
24
+ # @return [String]
25
+ #
21
26
  # @api public
22
27
  def find_title(title, options = {})
28
+ return title if title.nil? || title.empty?
29
+
23
30
  options[:scope] ||= translation_scope
24
31
  options[:default] = Array(options[:default])
25
32
  options[:default] << title if options[:default].empty?
26
- I18n.t("#{title}", options)
33
+ I18n.t(title.to_s, options)
27
34
  end
35
+ module_function :find_title
28
36
  end # Translation
29
37
  end # Loaf
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Loaf
2
- VERSION = '0.7.0'
4
+ VERSION = '0.8.0'.freeze
3
5
  end # Loaf
@@ -2,13 +2,12 @@
2
2
 
3
3
  require_relative 'breadcrumb'
4
4
  require_relative 'crumb'
5
- require_relative 'crumb_formatter'
6
5
  require_relative 'options_validator'
6
+ require_relative 'translation'
7
7
 
8
8
  module Loaf
9
9
  # A mixin to define view extensions
10
10
  module ViewExtensions
11
- include Loaf::CrumbFormatter
12
11
  include Loaf::OptionsValidator
13
12
 
14
13
  def initialize(*)
@@ -51,7 +50,7 @@ module Loaf
51
50
  valid?(options)
52
51
  options = Loaf.configuration.to_hash.merge(options)
53
52
  _breadcrumbs.each do |crumb|
54
- name = format_name(crumb.name, options)
53
+ name = title_for(crumb.name)
55
54
  path = url_for(_expand_url(crumb.url))
56
55
  current = current_crumb?(path, crumb.match)
57
56
 
@@ -107,6 +106,15 @@ module Loaf
107
106
 
108
107
  private
109
108
 
109
+ # Find title translation for a crumb name
110
+ #
111
+ # @return [String]
112
+ #
113
+ # @api private
114
+ def title_for(name)
115
+ Translation.find_title(name)
116
+ end
117
+
110
118
  # Expand url in the current context of the view
111
119
  #
112
120
  # @api private
@@ -1,29 +1,23 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe Loaf::Configuration do
4
4
  it "allows to set and read attributes" do
5
5
  config = Loaf::Configuration.new
6
-
7
- config.crumb_length = 4
8
- expect(config.crumb_length).to eq(4)
9
-
10
6
  config.match = :exact
11
7
  expect(config.match).to eq(:exact)
12
8
  end
13
9
 
14
10
  it "accepts attributes at initialization" do
15
- options = { crumb_length: 12, match: :exact }
11
+ options = { locales_path: '/lib', match: :exact }
16
12
  config = Loaf::Configuration.new(options)
17
13
 
18
- expect(config.crumb_length).to eq(12)
14
+ expect(config.locales_path).to eq('/lib')
19
15
  expect(config.match).to eq(:exact)
20
16
  end
21
17
 
22
18
  it "exports configuration as hash" do
23
19
  config = Loaf::Configuration.new
24
20
  expect(config.to_hash).to eq({
25
- capitalize: false,
26
- crumb_length: 30,
27
21
  locales_path: '/',
28
22
  match: :inclusive
29
23
  })
@@ -4,7 +4,7 @@ RSpec.describe Loaf::OptionsValidator, '.valid?' do
4
4
  let(:klass) { Class.extend Loaf::OptionsValidator }
5
5
 
6
6
  it 'validates succesfully known option' do
7
- expect(klass.valid?(crumb_length: 10)).to eq(true)
7
+ expect(klass.valid?(match: :exact)).to eq(true)
8
8
  end
9
9
 
10
10
  it 'validates unknown option with an error' do
@@ -6,6 +6,14 @@ RSpec.describe Loaf::Translation do
6
6
 
7
7
  after { I18n.backend.reload! }
8
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
+
9
17
  it 'translates breadcrumb title' do
10
18
  I18n.backend.store_translations 'en', loaf: { breadcrumbs: { home: 'Home'}}
11
19
  expect(described_class.find_title('home')).to eql('Home')
@@ -196,8 +196,21 @@ RSpec.describe Loaf::ViewExtensions, '#breadcrumb_trail' do
196
196
  }.to raise_error(Loaf::InvalidOptions)
197
197
  end
198
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
+
199
213
  it 'uses global configuration for crumb formatting' do
200
- allow(Loaf.configuration).to receive(:crumb_length).and_return(10)
201
214
  view = DummyView.new
202
215
  view.breadcrumb('home-sweet-home', :home_path)
203
216
  view.breadcrumb('posts-for-everybody', :posts_path)
@@ -208,13 +221,12 @@ RSpec.describe Loaf::ViewExtensions, '#breadcrumb_trail' do
208
221
  view.breadcrumb_trail(&block)
209
222
 
210
223
  expect(yielded).to eq([
211
- ['home-sw...', '/', false],
212
- ['posts-f...', '/posts', true]
224
+ ['home-sweet-home', '/', false],
225
+ ['posts-for-everybody', '/posts', true]
213
226
  ])
214
227
  end
215
228
 
216
229
  it "allows to overwrite global configuration" do
217
- allow(Loaf.configuration).to receive(:crumb_length).and_return(10)
218
230
  view = DummyView.new
219
231
  view.breadcrumb('home-sweet-home', :home_path)
220
232
  view.breadcrumb('posts-for-everybody', :posts_path)
@@ -222,11 +234,11 @@ RSpec.describe Loaf::ViewExtensions, '#breadcrumb_trail' do
222
234
 
223
235
  yielded = []
224
236
  block = -> (crumb) { yielded << crumb.to_a }
225
- view.breadcrumb_trail(crumb_length: 15, &block)
237
+ view.breadcrumb_trail(match: :exact, &block)
226
238
 
227
239
  expect(yielded).to eq([
228
240
  ['home-sweet-home', '/', false],
229
- ['posts-for-ev...', '/posts', true]
241
+ ['posts-for-everybody', '/posts', true]
230
242
  ])
231
243
  end
232
244
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loaf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-20 00:00:00.000000000 Z
11
+ date: 2018-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -93,7 +93,6 @@ files:
93
93
  - lib/loaf/configuration.rb
94
94
  - lib/loaf/controller_extensions.rb
95
95
  - lib/loaf/crumb.rb
96
- - lib/loaf/crumb_formatter.rb
97
96
  - lib/loaf/errors.rb
98
97
  - lib/loaf/options_validator.rb
99
98
  - lib/loaf/railtie.rb
@@ -147,7 +146,6 @@ files:
147
146
  - spec/support/load_routes.rb
148
147
  - spec/unit/configuration_spec.rb
149
148
  - spec/unit/controller_extensions_spec.rb
150
- - spec/unit/crumb_formatter_spec.rb
151
149
  - spec/unit/crumb_spec.rb
152
150
  - spec/unit/generators/install_generator_spec.rb
153
151
  - spec/unit/options_validator_spec.rb
@@ -180,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
178
  version: '0'
181
179
  requirements: []
182
180
  rubyforge_project:
183
- rubygems_version: 2.5.1
181
+ rubygems_version: 2.7.3
184
182
  signing_key:
185
183
  specification_version: 4
186
184
  summary: Loaf manages and displays breadcrumb trails in your Rails application.
@@ -231,7 +229,6 @@ test_files:
231
229
  - spec/support/load_routes.rb
232
230
  - spec/unit/configuration_spec.rb
233
231
  - spec/unit/controller_extensions_spec.rb
234
- - spec/unit/crumb_formatter_spec.rb
235
232
  - spec/unit/crumb_spec.rb
236
233
  - spec/unit/generators/install_generator_spec.rb
237
234
  - spec/unit/options_validator_spec.rb
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'translation'
4
-
5
- module Loaf
6
- # A mixin for formatting crumb name
7
- module CrumbFormatter
8
- # @param [String] name
9
- # the name to format
10
- #
11
- # @api public
12
- def format_name(name, options = {})
13
- return name if name.nil? || name.empty?
14
-
15
- formatted = name.to_s.dup
16
- formatted = Loaf::Translation.find_title(formatted)
17
- formatted = formatted.capitalize if options[:capitalize]
18
- if options[:crumb_length]
19
- formatted = truncate(formatted, length: options[:crumb_length])
20
- end
21
- formatted
22
- end
23
- end # CrumbFormatter
24
- end # Loaf
@@ -1,36 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe Loaf::CrumbFormatter, '.format_name' do
4
- let(:formatter) {
5
- Class.new do
6
- extend Loaf::CrumbFormatter
7
-
8
- def self.truncate(name, options)
9
- name
10
- end
11
- end
12
- }
13
-
14
- it 'returns name error if breadcrumb name is nil' do
15
- expect(formatter.format_name('')).to eql('')
16
- end
17
-
18
- it "doesn't capitalize by default" do
19
- name = 'some random name'
20
- formatted = formatter.format_name(name)
21
- expect(formatted).to eql(name)
22
- end
23
-
24
- it 'capitalizes crumb name with capitalize option' do
25
- name = 'some random name'
26
- formatted = formatter.format_name(name, capitalize: true)
27
- expect(formatted).to eql('Some random name')
28
- end
29
-
30
- it 'shortens crumb to provided length' do
31
- name = 'very long name that is more that 30 characters long'
32
- allow(formatter).to receive(:truncate).with(name, length: 30).
33
- and_return(name[0..30])
34
- expect(formatter.format_name(name, crumb_length: 30)).to eql(name[0..30])
35
- end
36
- end