gretel 3.0.7 → 4.0.2

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 +5 -5
  2. data/.gitignore +11 -7
  3. data/.travis.yml +9 -7
  4. data/CHANGELOG.md +29 -1
  5. data/Gemfile +2 -13
  6. data/LICENSE.txt +2 -2
  7. data/README.md +36 -84
  8. data/Rakefile +3 -7
  9. data/coverage/coverage.txt +5 -0
  10. data/gretel.gemspec +12 -11
  11. data/lib/gretel.rb +2 -23
  12. data/lib/gretel/crumb.rb +9 -0
  13. data/lib/gretel/renderer.rb +43 -27
  14. data/lib/gretel/version.rb +2 -2
  15. data/lib/gretel/view_helpers.rb +0 -4
  16. metadata +63 -116
  17. data/gemfiles/Gemfile-rails.3.2.x +0 -17
  18. data/gemfiles/Gemfile-rails.4.0.x +0 -17
  19. data/gemfiles/Gemfile-rails.4.1.x +0 -17
  20. data/lib/gretel/deprecated.rb +0 -1
  21. data/lib/gretel/deprecated/default_style_key.rb +0 -11
  22. data/lib/gretel/deprecated/layout.rb +0 -15
  23. data/lib/gretel/deprecated/show_root_alone.rb +0 -12
  24. data/lib/gretel/deprecated/yield_links.rb +0 -20
  25. data/test/deprecated_test.rb +0 -45
  26. data/test/dummy/Rakefile +0 -7
  27. data/test/dummy/app/assets/javascripts/application.js +0 -15
  28. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  29. data/test/dummy/app/controllers/application_controller.rb +0 -3
  30. data/test/dummy/app/helpers/application_helper.rb +0 -5
  31. data/test/dummy/app/mailers/.gitkeep +0 -0
  32. data/test/dummy/app/models/.gitkeep +0 -0
  33. data/test/dummy/app/models/issue.rb +0 -3
  34. data/test/dummy/app/models/project.rb +0 -3
  35. data/test/dummy/app/views/breadcrumbs/site.rb +0 -3
  36. data/test/dummy/config.ru +0 -4
  37. data/test/dummy/config/application.rb +0 -14
  38. data/test/dummy/config/boot.rb +0 -10
  39. data/test/dummy/config/breadcrumbs.rb +0 -3
  40. data/test/dummy/config/breadcrumbs/test_crumbs.rb +0 -80
  41. data/test/dummy/config/database.yml +0 -25
  42. data/test/dummy/config/environment.rb +0 -5
  43. data/test/dummy/config/environments/development.rb +0 -2
  44. data/test/dummy/config/environments/production.rb +0 -2
  45. data/test/dummy/config/environments/test.rb +0 -2
  46. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  47. data/test/dummy/config/initializers/inflections.rb +0 -15
  48. data/test/dummy/config/initializers/mime_types.rb +0 -5
  49. data/test/dummy/config/initializers/secret_token.rb +0 -7
  50. data/test/dummy/config/initializers/session_store.rb +0 -8
  51. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  52. data/test/dummy/config/locales/en.yml +0 -5
  53. data/test/dummy/config/routes.rb +0 -11
  54. data/test/dummy/db/migrate/20130122163007_create_projects.rb +0 -9
  55. data/test/dummy/db/migrate/20130122163051_create_issues.rb +0 -10
  56. data/test/dummy/db/schema.rb +0 -29
  57. data/test/dummy/lib/assets/.gitkeep +0 -0
  58. data/test/dummy/log/.gitkeep +0 -0
  59. data/test/dummy/public/404.html +0 -26
  60. data/test/dummy/public/422.html +0 -26
  61. data/test/dummy/public/500.html +0 -25
  62. data/test/dummy/public/favicon.ico +0 -0
  63. data/test/dummy/script/rails +0 -6
  64. data/test/fixtures/issues.yml +0 -4
  65. data/test/fixtures/projects.yml +0 -3
  66. data/test/gretel_test.rb +0 -24
  67. data/test/helper_methods_test.rb +0 -532
  68. data/test/test_helper.rb +0 -15
@@ -3,6 +3,12 @@ module Gretel
3
3
  # Initializes a new crumb from the given +key+.
4
4
  # It finds the breadcrumb created in +Gretel::Crumbs.layout+ and renders the block using the arguments supplied in +args+.
5
5
  def initialize(context, key, *args)
6
+ if key.class.respond_to?(:model_name)
7
+ # Enables calling `breadcrumb @product` instead of `breadcrumb :product, @product`
8
+ args.unshift key
9
+ key = key.class.model_name.to_s.underscore.to_sym
10
+ end
11
+
6
12
  block = Gretel::Crumbs.crumbs[key]
7
13
  raise ArgumentError, "Breadcrumb :#{key} not found." unless block
8
14
  @key = key
@@ -38,6 +44,9 @@ module Gretel
38
44
  #
39
45
  # Example:
40
46
  # parent :category, category
47
+ #
48
+ # Or short, which will infer the key from the model's `model_name`:
49
+ # parent category
41
50
  def parent(*args)
42
51
  return @parent if args.empty?
43
52
  key = args.shift
@@ -8,6 +8,7 @@ module Gretel
8
8
  autoroot: true,
9
9
  display_single_fragment: false,
10
10
  link_current: false,
11
+ link_current_to_request_path: true,
11
12
  semantic: false,
12
13
  class: "breadcrumbs",
13
14
  current_class: "current",
@@ -21,6 +22,7 @@ module Gretel
21
22
  ol: { container_tag: :ol, fragment_tag: :li },
22
23
  ul: { container_tag: :ul, fragment_tag: :li },
23
24
  bootstrap: { container_tag: :ol, fragment_tag: :li, class: "breadcrumb", current_class: "active" },
25
+ bootstrap4: { container_tag: :ol, fragment_tag: :li, class: "breadcrumb", fragment_class: "breadcrumb-item", current_class: "active" },
24
26
  foundation5: { container_tag: :ul, fragment_tag: :li, class: "breadcrumbs", current_class: "current" }
25
27
  }
26
28
 
@@ -38,11 +40,6 @@ module Gretel
38
40
  LinkCollection.new(context, links, options)
39
41
  end
40
42
 
41
- # Yields links with applied options.
42
- def yield_links(options = {})
43
- yield render(options)
44
- end
45
-
46
43
  # Returns the parent breadcrumb.
47
44
  def parent_breadcrumb(options = {})
48
45
  render(options)[-2]
@@ -84,7 +81,7 @@ module Gretel
84
81
  end
85
82
 
86
83
  # Set current link to actual path
87
- if out.any? && request
84
+ if options[:link_current_to_request_path] && out.any? && request
88
85
  out.last.url = request.fullpath
89
86
  end
90
87
 
@@ -111,7 +108,7 @@ module Gretel
111
108
 
112
109
  # Links of first crumb
113
110
  links = crumb.links.dup
114
-
111
+
115
112
  # Get parent links
116
113
  links.unshift *parent_links_for(crumb)
117
114
 
@@ -137,9 +134,9 @@ module Gretel
137
134
 
138
135
  class << self
139
136
  include Resettable
140
-
137
+
141
138
  # Registers a style for later use.
142
- #
139
+ #
143
140
  # Gretel::Renderer.register_style :ul, { container_tag: :ul, fragment_tag: :li }
144
141
  def register_style(style_key, options)
145
142
  styles[style_key] = options
@@ -169,13 +166,14 @@ module Gretel
169
166
  return "" if links.empty?
170
167
 
171
168
  # Loop through all but the last (current) link and build HTML of the fragments
172
- fragments = links[0..-2].map do |link|
173
- render_fragment(options[:fragment_tag], link.text, link.url, options[:semantic])
169
+ fragments = links[0..-2].map.with_index do |link, index|
170
+ render_fragment(options[:fragment_tag], link.text, link.url, options[:semantic], index + 1, fragment_class: options[:fragment_class])
174
171
  end
175
172
 
176
173
  # The current link is handled a little differently, and is only linked if specified in the options
177
174
  current_link = links.last
178
- fragments << render_fragment(options[:fragment_tag], current_link.text, (options[:link_current] ? current_link.url : nil), options[:semantic], class: options[:current_class])
175
+ position = links.size
176
+ fragments << render_fragment(options[:fragment_tag], current_link.text, (options[:link_current] ? current_link.url : nil), options[:semantic], position, fragment_class: options[:fragment_class], class: options[:current_class], current_link: current_link.url)
179
177
 
180
178
  # Build the final HTML
181
179
  html_fragments = []
@@ -191,42 +189,55 @@ module Gretel
191
189
  end
192
190
 
193
191
  html = html_fragments.join(" ").html_safe
194
- content_tag(options[:container_tag], html, id: options[:id], class: options[:class])
192
+
193
+ if options[:semantic]
194
+ content_tag(options[:container_tag], html, id: options[:id], class: options[:class], itemscope: "", itemtype: "https://schema.org/BreadcrumbList")
195
+ else
196
+ content_tag(options[:container_tag], html, id: options[:id], class: options[:class])
197
+ end
195
198
  end
196
199
 
197
200
  alias :to_s :render
198
201
 
199
202
  # Renders HTML for a breadcrumb fragment, i.e. a breadcrumb link.
200
- def render_fragment(fragment_tag, text, url, semantic, options = {})
203
+ def render_fragment(fragment_tag, text, url, semantic, position, options = {})
201
204
  if semantic
202
- render_semantic_fragment(fragment_tag, text, url, options)
205
+ render_semantic_fragment(fragment_tag, text, url, position, options)
203
206
  else
204
207
  render_nonsemantic_fragment(fragment_tag, text, url, options)
205
208
  end
206
209
  end
207
210
 
208
211
  # Renders semantic fragment HTML.
209
- def render_semantic_fragment(fragment_tag, text, url, options = {})
210
- if fragment_tag
211
- text = content_tag(:span, text, itemprop: "title")
212
- text = breadcrumb_link_to(text, url, itemprop: "url") if url.present?
213
- content_tag(fragment_tag, text, class: options[:class], itemscope: "", itemtype: "http://data-vocabulary.org/Breadcrumb")
214
- elsif url.present?
215
- content_tag(:span, breadcrumb_link_to(content_tag(:span, text, itemprop: "title"), url, class: options[:class], itemprop: "url"), itemscope: "", itemtype: "http://data-vocabulary.org/Breadcrumb")
216
- else
217
- content_tag(:span, content_tag(:span, text, class: options[:class], itemprop: "title"), itemscope: "", itemtype: "http://data-vocabulary.org/Breadcrumb")
212
+ def render_semantic_fragment(fragment_tag, text, url, position, options = {})
213
+ fragment_class = [options[:fragment_class], options[:class]].join(' ').strip
214
+ fragment_class = nil if fragment_class.blank?
215
+ fragment_tag = fragment_tag || 'span'
216
+ text = content_tag(:span, text, itemprop: "name")
217
+
218
+ if url.present?
219
+ text = breadcrumb_link_to(text, url, itemprop: "item")
220
+ elsif options[:current_link].present?
221
+ current_url = "#{root_url}#{options[:current_link].gsub(/^\//, '')}"
222
+ text = text + tag(:meta, itemprop: "item", content: current_url)
218
223
  end
224
+
225
+ text = text + tag(:meta, itemprop:"position", content: "#{position}")
226
+ content_tag(fragment_tag.to_sym, text, class: fragment_class, itemprop: "itemListElement", itemscope: "", itemtype: "https://schema.org/ListItem")
219
227
  end
220
228
 
221
229
  # Renders regular, non-semantic fragment HTML.
222
230
  def render_nonsemantic_fragment(fragment_tag, text, url, options = {})
231
+ fragment_class = [options[:fragment_class], options[:class]].join(' ').strip
232
+ fragment_class = nil if fragment_class.blank?
233
+
223
234
  if fragment_tag
224
235
  text = breadcrumb_link_to(text, url) if url.present?
225
- content_tag(fragment_tag, text, class: options[:class])
236
+ content_tag(fragment_tag, text, class: fragment_class)
226
237
  elsif url.present?
227
- breadcrumb_link_to(text, url, class: options[:class])
238
+ breadcrumb_link_to(text, url, class: fragment_class)
228
239
  elsif options[:class].present?
229
- content_tag(:span, text, class: options[:class])
240
+ content_tag(:span, text, class: fragment_class)
230
241
  else
231
242
  text
232
243
  end
@@ -241,6 +252,11 @@ module Gretel
241
252
  def method_missing(method, *args, &block)
242
253
  context.send(method, *args, &block)
243
254
  end
255
+
256
+ # Avoid unnecessary html escaping by template engines.
257
+ def html_safe?
258
+ true
259
+ end
244
260
  end
245
261
  end
246
262
  end
@@ -1,3 +1,3 @@
1
1
  module Gretel
2
- VERSION = "3.0.7"
3
- end
2
+ VERSION = "4.0.2"
3
+ end
@@ -10,10 +10,6 @@ module Gretel
10
10
  def breadcrumb(key = nil, *args)
11
11
  if key.nil? || key.is_a?(Hash)
12
12
  raise ArgumentError, "The `breadcrumb` method was called with #{key.inspect} as the key. This method is used to set the breadcrumb. Maybe you meant to call the `breadcrumbs` method (with an 's' in the end) which is used to render the breadcrumbs?"
13
- elsif key.class.respond_to?(:model_name)
14
- # Enables calling `breadcrumb @product` instead of `breadcrumb :product, @product`
15
- args.unshift key
16
- key = key.class.model_name.to_s.underscore.to_sym
17
13
  end
18
14
  @_gretel_renderer = Gretel::Renderer.new(self, key, *args)
19
15
  end
metadata CHANGED
@@ -1,61 +1,102 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gretel
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.7
4
+ version: 4.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lasse Bunk
8
- autorequire:
8
+ - Kazuki Nishikawa
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-05-14 00:00:00.000000000 Z
12
+ date: 2020-08-25 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rails
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - '>='
18
+ - - ">="
18
19
  - !ruby/object:Gem::Version
19
- version: 3.2.0
20
+ version: '5.1'
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - '>='
25
+ - - ">="
25
26
  - !ruby/object:Gem::Version
26
- version: 3.2.0
27
+ version: '5.1'
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: sqlite3
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - '>='
32
+ - - ">="
32
33
  - !ruby/object:Gem::Version
33
34
  version: '0'
34
35
  type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
- - - '>='
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec-rails
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: simplecov
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: simplecov-erb
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
39
82
  - !ruby/object:Gem::Version
40
83
  version: '0'
41
84
  description: Gretel is a Ruby on Rails plugin that makes it easy yet flexible to create
42
85
  breadcrumbs.
43
86
  email:
44
- - lassebunk@gmail.com
87
+ - kzkn@users.noreply.github.com
45
88
  executables: []
46
89
  extensions: []
47
90
  extra_rdoc_files: []
48
91
  files:
49
- - .gitignore
50
- - .travis.yml
92
+ - ".gitignore"
93
+ - ".travis.yml"
51
94
  - CHANGELOG.md
52
95
  - Gemfile
53
96
  - LICENSE.txt
54
97
  - README.md
55
98
  - Rakefile
56
- - gemfiles/Gemfile-rails.3.2.x
57
- - gemfiles/Gemfile-rails.4.0.x
58
- - gemfiles/Gemfile-rails.4.1.x
99
+ - coverage/coverage.txt
59
100
  - gretel.gemspec
60
101
  - lib/generators/gretel/USAGE
61
102
  - lib/generators/gretel/install_generator.rb
@@ -63,126 +104,32 @@ files:
63
104
  - lib/gretel.rb
64
105
  - lib/gretel/crumb.rb
65
106
  - lib/gretel/crumbs.rb
66
- - lib/gretel/deprecated.rb
67
- - lib/gretel/deprecated/default_style_key.rb
68
- - lib/gretel/deprecated/layout.rb
69
- - lib/gretel/deprecated/show_root_alone.rb
70
- - lib/gretel/deprecated/yield_links.rb
71
107
  - lib/gretel/link.rb
72
108
  - lib/gretel/renderer.rb
73
109
  - lib/gretel/resettable.rb
74
110
  - lib/gretel/version.rb
75
111
  - lib/gretel/view_helpers.rb
76
- - test/deprecated_test.rb
77
- - test/dummy/Rakefile
78
- - test/dummy/app/assets/javascripts/application.js
79
- - test/dummy/app/assets/stylesheets/application.css
80
- - test/dummy/app/controllers/application_controller.rb
81
- - test/dummy/app/helpers/application_helper.rb
82
- - test/dummy/app/mailers/.gitkeep
83
- - test/dummy/app/models/.gitkeep
84
- - test/dummy/app/models/issue.rb
85
- - test/dummy/app/models/project.rb
86
- - test/dummy/app/views/breadcrumbs/site.rb
87
- - test/dummy/config.ru
88
- - test/dummy/config/application.rb
89
- - test/dummy/config/boot.rb
90
- - test/dummy/config/breadcrumbs.rb
91
- - test/dummy/config/breadcrumbs/test_crumbs.rb
92
- - test/dummy/config/database.yml
93
- - test/dummy/config/environment.rb
94
- - test/dummy/config/environments/development.rb
95
- - test/dummy/config/environments/production.rb
96
- - test/dummy/config/environments/test.rb
97
- - test/dummy/config/initializers/backtrace_silencers.rb
98
- - test/dummy/config/initializers/inflections.rb
99
- - test/dummy/config/initializers/mime_types.rb
100
- - test/dummy/config/initializers/secret_token.rb
101
- - test/dummy/config/initializers/session_store.rb
102
- - test/dummy/config/initializers/wrap_parameters.rb
103
- - test/dummy/config/locales/en.yml
104
- - test/dummy/config/routes.rb
105
- - test/dummy/db/migrate/20130122163007_create_projects.rb
106
- - test/dummy/db/migrate/20130122163051_create_issues.rb
107
- - test/dummy/db/schema.rb
108
- - test/dummy/lib/assets/.gitkeep
109
- - test/dummy/log/.gitkeep
110
- - test/dummy/public/404.html
111
- - test/dummy/public/422.html
112
- - test/dummy/public/500.html
113
- - test/dummy/public/favicon.ico
114
- - test/dummy/script/rails
115
- - test/fixtures/issues.yml
116
- - test/fixtures/projects.yml
117
- - test/gretel_test.rb
118
- - test/helper_methods_test.rb
119
- - test/test_helper.rb
120
- homepage: http://github.com/lassebunk/gretel
112
+ homepage: http://github.com/kzkn/gretel
121
113
  licenses:
122
114
  - MIT
123
115
  metadata: {}
124
- post_install_message:
116
+ post_install_message:
125
117
  rdoc_options: []
126
118
  require_paths:
127
119
  - lib
128
120
  required_ruby_version: !ruby/object:Gem::Requirement
129
121
  requirements:
130
- - - '>='
122
+ - - ">="
131
123
  - !ruby/object:Gem::Version
132
124
  version: '0'
133
125
  required_rubygems_version: !ruby/object:Gem::Requirement
134
126
  requirements:
135
- - - '>='
127
+ - - ">="
136
128
  - !ruby/object:Gem::Version
137
129
  version: '0'
138
130
  requirements: []
139
- rubyforge_project:
140
- rubygems_version: 2.1.10
141
- signing_key:
131
+ rubygems_version: 3.0.3
132
+ signing_key:
142
133
  specification_version: 4
143
134
  summary: Flexible Ruby on Rails breadcrumbs plugin.
144
- test_files:
145
- - test/deprecated_test.rb
146
- - test/dummy/Rakefile
147
- - test/dummy/app/assets/javascripts/application.js
148
- - test/dummy/app/assets/stylesheets/application.css
149
- - test/dummy/app/controllers/application_controller.rb
150
- - test/dummy/app/helpers/application_helper.rb
151
- - test/dummy/app/mailers/.gitkeep
152
- - test/dummy/app/models/.gitkeep
153
- - test/dummy/app/models/issue.rb
154
- - test/dummy/app/models/project.rb
155
- - test/dummy/app/views/breadcrumbs/site.rb
156
- - test/dummy/config.ru
157
- - test/dummy/config/application.rb
158
- - test/dummy/config/boot.rb
159
- - test/dummy/config/breadcrumbs.rb
160
- - test/dummy/config/breadcrumbs/test_crumbs.rb
161
- - test/dummy/config/database.yml
162
- - test/dummy/config/environment.rb
163
- - test/dummy/config/environments/development.rb
164
- - test/dummy/config/environments/production.rb
165
- - test/dummy/config/environments/test.rb
166
- - test/dummy/config/initializers/backtrace_silencers.rb
167
- - test/dummy/config/initializers/inflections.rb
168
- - test/dummy/config/initializers/mime_types.rb
169
- - test/dummy/config/initializers/secret_token.rb
170
- - test/dummy/config/initializers/session_store.rb
171
- - test/dummy/config/initializers/wrap_parameters.rb
172
- - test/dummy/config/locales/en.yml
173
- - test/dummy/config/routes.rb
174
- - test/dummy/db/migrate/20130122163007_create_projects.rb
175
- - test/dummy/db/migrate/20130122163051_create_issues.rb
176
- - test/dummy/db/schema.rb
177
- - test/dummy/lib/assets/.gitkeep
178
- - test/dummy/log/.gitkeep
179
- - test/dummy/public/404.html
180
- - test/dummy/public/422.html
181
- - test/dummy/public/500.html
182
- - test/dummy/public/favicon.ico
183
- - test/dummy/script/rails
184
- - test/fixtures/issues.yml
185
- - test/fixtures/projects.yml
186
- - test/gretel_test.rb
187
- - test/helper_methods_test.rb
188
- - test/test_helper.rb
135
+ test_files: []
@@ -1,17 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "gretel", :path => ".."
4
-
5
- gem "rails", "~> 3.2.0"
6
- gem "sqlite3"
7
-
8
- # jquery-rails is used by the dummy application
9
- gem "jquery-rails"
10
-
11
- # Declare any dependencies that are still in development here instead of in
12
- # your gemspec. These might include edge Rails or gems from your path or
13
- # Git. Remember to move these dependencies to your gemspec before releasing
14
- # your gem to rubygems.org.
15
-
16
- # To use debugger
17
- # gem 'debugger'