twitter-bootstrap-rails 2.2.8 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of twitter-bootstrap-rails might be problematic. Click here for more details.

Files changed (181) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +82 -119
  3. data/Rakefile +4 -6
  4. data/app/assets/fonts/fontawesome-webfont.eot +0 -0
  5. data/app/assets/fonts/fontawesome-webfont.svg +471 -366
  6. data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
  7. data/app/assets/fonts/fontawesome-webfont.woff +0 -0
  8. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  9. data/app/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  10. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  11. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  12. data/app/assets/javascripts/twitter/bootstrap.js +12 -13
  13. data/app/assets/javascripts/twitter/bootstrap/affix.js +137 -0
  14. data/app/assets/javascripts/twitter/bootstrap/alert.js +88 -0
  15. data/app/assets/javascripts/twitter/bootstrap/button.js +107 -0
  16. data/app/assets/javascripts/twitter/bootstrap/carousel.js +205 -0
  17. data/app/assets/javascripts/twitter/bootstrap/collapse.js +170 -0
  18. data/app/assets/javascripts/twitter/bootstrap/dropdown.js +147 -0
  19. data/app/assets/javascripts/twitter/bootstrap/modal.js +243 -0
  20. data/app/assets/javascripts/twitter/bootstrap/popover.js +110 -0
  21. data/app/assets/javascripts/twitter/bootstrap/scrollspy.js +153 -0
  22. data/app/assets/javascripts/twitter/bootstrap/tab.js +125 -0
  23. data/app/assets/javascripts/twitter/bootstrap/tooltip.js +399 -0
  24. data/app/assets/javascripts/twitter/bootstrap/transition.js +48 -0
  25. data/app/assets/stylesheets/twitter-bootstrap-static/bootstrap.css.erb +1 -890
  26. data/app/assets/stylesheets/twitter-bootstrap-static/fontawesome.css.erb +4 -787
  27. data/app/assets/stylesheets/twitter-bootstrap-static/sprites.css.erb +1 -146
  28. data/app/helpers/bootstrap_flash_helper.rb +7 -5
  29. data/app/helpers/form_errors_helper.rb +22 -0
  30. data/app/helpers/glyph_helper.rb +8 -6
  31. data/app/helpers/modal_helper.rb +29 -21
  32. data/app/helpers/navbar_helper.rb +42 -30
  33. data/app/helpers/twitter_breadcrumbs_helper.rb +3 -2
  34. data/app/views/twitter-bootstrap/_breadcrumbs.html.erb +4 -4
  35. data/lib/generators/bootstrap/install/install_generator.rb +3 -2
  36. data/lib/generators/bootstrap/install/templates/bootstrap_and_overrides.less +7 -8
  37. data/lib/generators/bootstrap/install/templates/en.bootstrap.yml +5 -0
  38. data/lib/generators/bootstrap/layout/layout_generator.rb +1 -4
  39. data/lib/generators/bootstrap/layout/templates/layout.html.erb +22 -43
  40. data/lib/generators/bootstrap/layout/templates/layout.html.haml +16 -31
  41. data/lib/generators/bootstrap/layout/templates/layout.html.slim +10 -25
  42. data/lib/generators/bootstrap/partial/templates/_login.html.erb +2 -3
  43. data/lib/generators/bootstrap/themed/templates/_form.html.erb +25 -8
  44. data/lib/generators/bootstrap/themed/templates/_form.html.haml +7 -7
  45. data/lib/generators/bootstrap/themed/templates/_form.html.slim +7 -7
  46. data/lib/generators/bootstrap/themed/templates/index.html.erb +2 -2
  47. data/lib/generators/bootstrap/themed/templates/index.html.haml +2 -2
  48. data/lib/generators/bootstrap/themed/templates/index.html.slim +2 -2
  49. data/lib/generators/bootstrap/themed/templates/show.html.erb +5 -7
  50. data/lib/generators/bootstrap/themed/templates/show.html.haml +4 -4
  51. data/lib/generators/bootstrap/themed/templates/show.html.slim +5 -6
  52. data/lib/generators/bootstrap/themed/templates/simple_form/_form.html.erb +5 -5
  53. data/lib/generators/bootstrap/themed/templates/simple_form/_form.html.haml +3 -3
  54. data/lib/generators/bootstrap/themed/templates/simple_form/_form.html.slim +4 -4
  55. data/lib/generators/bootstrap/themed/themed_generator.rb +2 -2
  56. data/lib/twitter/bootstrap/rails/{twitter-bootstrap-breadcrumbs.rb → breadcrumbs.rb} +24 -8
  57. data/lib/twitter/bootstrap/rails/engine.rb +5 -2
  58. data/lib/twitter/bootstrap/rails/version.rb +2 -2
  59. data/spec/lib/breadcrumbs_spec.rb +74 -0
  60. data/spec/lib/twitter_bootstrap_rails/badge_label_helper_spec.rb +4 -2
  61. data/spec/lib/twitter_bootstrap_rails/modal_helper_spec.rb +15 -15
  62. data/spec/lib/twitter_bootstrap_rails/navbar_helper_spec.rb +157 -173
  63. data/spec/lib/twitter_bootstrap_rails/uri_state_spec.rb +18 -16
  64. data/spec/spec_helper.rb +7 -1
  65. data/vendor/assets/stylesheets/twitter-bootstrap-static/bootstrap.css.erb +5797 -0
  66. data/vendor/static-source/bootstrap.less +0 -1
  67. data/vendor/static-source/fontawesome.less +0 -1
  68. data/vendor/static-source/sprites.less +1 -1
  69. data/vendor/toolkit/fontawesome/bordered-pulled.less +16 -0
  70. data/vendor/toolkit/fontawesome/core.less +9 -126
  71. data/vendor/toolkit/fontawesome/fixed-width.less +6 -0
  72. data/vendor/toolkit/fontawesome/font-awesome.less +9 -25
  73. data/vendor/toolkit/fontawesome/icons.less +503 -378
  74. data/vendor/toolkit/fontawesome/larger.less +13 -0
  75. data/vendor/toolkit/fontawesome/list.less +19 -0
  76. data/vendor/toolkit/fontawesome/mixins.less +14 -42
  77. data/vendor/toolkit/fontawesome/path.less +1 -1
  78. data/vendor/toolkit/fontawesome/rotated-flipped.less +9 -0
  79. data/vendor/toolkit/fontawesome/spinning.less +32 -0
  80. data/vendor/toolkit/fontawesome/stacked.less +20 -0
  81. data/vendor/toolkit/fontawesome/variables.less +511 -731
  82. data/vendor/toolkit/twitter/bootstrap/alerts.less +47 -58
  83. data/vendor/toolkit/twitter/bootstrap/badges.less +55 -0
  84. data/vendor/toolkit/twitter/bootstrap/bootstrap.less +27 -39
  85. data/vendor/toolkit/twitter/bootstrap/breadcrumbs.less +11 -9
  86. data/vendor/toolkit/twitter/bootstrap/button-groups.less +168 -152
  87. data/vendor/toolkit/twitter/bootstrap/buttons.less +101 -170
  88. data/vendor/toolkit/twitter/bootstrap/carousel.less +150 -65
  89. data/vendor/toolkit/twitter/bootstrap/close.less +20 -19
  90. data/vendor/toolkit/twitter/bootstrap/code.less +38 -30
  91. data/vendor/toolkit/twitter/bootstrap/component-animations.less +12 -3
  92. data/vendor/toolkit/twitter/bootstrap/dropdowns.less +115 -148
  93. data/vendor/toolkit/twitter/bootstrap/forms.less +401 -547
  94. data/vendor/toolkit/twitter/bootstrap/glyphicons.less +233 -0
  95. data/vendor/toolkit/twitter/bootstrap/grid.less +74 -11
  96. data/vendor/toolkit/twitter/bootstrap/input-groups.less +166 -0
  97. data/vendor/toolkit/twitter/bootstrap/jumbotron.less +48 -0
  98. data/vendor/toolkit/twitter/bootstrap/labels.less +64 -0
  99. data/vendor/toolkit/twitter/bootstrap/list-group.less +132 -0
  100. data/vendor/toolkit/twitter/bootstrap/media.less +8 -7
  101. data/vendor/toolkit/twitter/bootstrap/mixins.less +36 -699
  102. data/vendor/toolkit/twitter/bootstrap/mixins/alerts.less +14 -0
  103. data/vendor/toolkit/twitter/bootstrap/mixins/background-variant.less +8 -0
  104. data/vendor/toolkit/twitter/bootstrap/mixins/border-radius.less +18 -0
  105. data/vendor/toolkit/twitter/bootstrap/mixins/buttons.less +52 -0
  106. data/vendor/toolkit/twitter/bootstrap/mixins/center-block.less +7 -0
  107. data/vendor/toolkit/twitter/bootstrap/mixins/clearfix.less +22 -0
  108. data/vendor/toolkit/twitter/bootstrap/mixins/forms.less +85 -0
  109. data/vendor/toolkit/twitter/bootstrap/mixins/gradients.less +59 -0
  110. data/vendor/toolkit/twitter/bootstrap/mixins/grid-framework.less +91 -0
  111. data/vendor/toolkit/twitter/bootstrap/mixins/grid.less +122 -0
  112. data/vendor/toolkit/twitter/bootstrap/mixins/hide-text.less +21 -0
  113. data/vendor/toolkit/twitter/bootstrap/mixins/image.less +33 -0
  114. data/vendor/toolkit/twitter/bootstrap/mixins/labels.less +12 -0
  115. data/vendor/toolkit/twitter/bootstrap/mixins/list-group.less +29 -0
  116. data/vendor/toolkit/twitter/bootstrap/mixins/nav-divider.less +10 -0
  117. data/vendor/toolkit/twitter/bootstrap/mixins/nav-vertical-align.less +9 -0
  118. data/vendor/toolkit/twitter/bootstrap/mixins/opacity.less +8 -0
  119. data/vendor/toolkit/twitter/bootstrap/mixins/pagination.less +23 -0
  120. data/vendor/toolkit/twitter/bootstrap/mixins/panels.less +24 -0
  121. data/vendor/toolkit/twitter/bootstrap/mixins/progress-bar.less +10 -0
  122. data/vendor/toolkit/twitter/bootstrap/mixins/reset-filter.less +8 -0
  123. data/vendor/toolkit/twitter/bootstrap/mixins/resize.less +6 -0
  124. data/vendor/toolkit/twitter/bootstrap/mixins/responsive-visibility.less +15 -0
  125. data/vendor/toolkit/twitter/bootstrap/mixins/size.less +10 -0
  126. data/vendor/toolkit/twitter/bootstrap/mixins/tab-focus.less +9 -0
  127. data/vendor/toolkit/twitter/bootstrap/mixins/table-row.less +28 -0
  128. data/vendor/toolkit/twitter/bootstrap/mixins/text-emphasis.less +8 -0
  129. data/vendor/toolkit/twitter/bootstrap/mixins/text-overflow.less +8 -0
  130. data/vendor/toolkit/twitter/bootstrap/mixins/vendor-prefixes.less +224 -0
  131. data/vendor/toolkit/twitter/bootstrap/modals.less +109 -54
  132. data/vendor/toolkit/twitter/bootstrap/navbar.less +542 -384
  133. data/vendor/toolkit/twitter/bootstrap/navs.less +192 -359
  134. data/vendor/toolkit/twitter/bootstrap/normalize.less +425 -0
  135. data/vendor/toolkit/twitter/bootstrap/pager.less +46 -34
  136. data/vendor/toolkit/twitter/bootstrap/pagination.less +70 -105
  137. data/vendor/toolkit/twitter/bootstrap/panels.less +248 -0
  138. data/vendor/toolkit/twitter/bootstrap/popovers.less +61 -61
  139. data/vendor/toolkit/twitter/bootstrap/print.less +101 -0
  140. data/vendor/toolkit/twitter/bootstrap/progress-bars.less +51 -73
  141. data/vendor/toolkit/twitter/bootstrap/responsive-embed.less +34 -0
  142. data/vendor/toolkit/twitter/bootstrap/responsive-utilities.less +177 -42
  143. data/vendor/toolkit/twitter/bootstrap/scaffolding.less +120 -23
  144. data/vendor/toolkit/twitter/bootstrap/tables.less +171 -182
  145. data/vendor/toolkit/twitter/bootstrap/theme.less +260 -0
  146. data/vendor/toolkit/twitter/bootstrap/thumbnails.less +26 -43
  147. data/vendor/toolkit/twitter/bootstrap/tooltip.less +49 -24
  148. data/vendor/toolkit/twitter/bootstrap/type.less +208 -147
  149. data/vendor/toolkit/twitter/bootstrap/utilities.less +33 -7
  150. data/vendor/toolkit/twitter/bootstrap/variables.less +761 -215
  151. data/vendor/toolkit/twitter/bootstrap/wells.less +7 -7
  152. metadata +128 -138
  153. data/app/assets/javascripts/twitter/bootstrap/bootstrap-affix.js +0 -117
  154. data/app/assets/javascripts/twitter/bootstrap/bootstrap-alert.js +0 -99
  155. data/app/assets/javascripts/twitter/bootstrap/bootstrap-button.js +0 -105
  156. data/app/assets/javascripts/twitter/bootstrap/bootstrap-carousel.js +0 -207
  157. data/app/assets/javascripts/twitter/bootstrap/bootstrap-collapse.js +0 -167
  158. data/app/assets/javascripts/twitter/bootstrap/bootstrap-dropdown.js +0 -169
  159. data/app/assets/javascripts/twitter/bootstrap/bootstrap-modal.js +0 -247
  160. data/app/assets/javascripts/twitter/bootstrap/bootstrap-popover.js +0 -114
  161. data/app/assets/javascripts/twitter/bootstrap/bootstrap-scrollspy.js +0 -162
  162. data/app/assets/javascripts/twitter/bootstrap/bootstrap-tab.js +0 -144
  163. data/app/assets/javascripts/twitter/bootstrap/bootstrap-tooltip.js +0 -361
  164. data/app/assets/javascripts/twitter/bootstrap/bootstrap-transition.js +0 -60
  165. data/app/assets/javascripts/twitter/bootstrap/bootstrap-typeahead.js +0 -335
  166. data/test/lib/breadcrumbs_test.rb +0 -75
  167. data/test/test_helper.rb +0 -11
  168. data/vendor/toolkit/fontawesome/bootstrap.less +0 -84
  169. data/vendor/toolkit/fontawesome/extras.less +0 -93
  170. data/vendor/toolkit/fontawesome/font-awesome-ie7.less +0 -1953
  171. data/vendor/toolkit/twitter/bootstrap/accordion.less +0 -34
  172. data/vendor/toolkit/twitter/bootstrap/hero-unit.less +0 -25
  173. data/vendor/toolkit/twitter/bootstrap/labels-badges.less +0 -84
  174. data/vendor/toolkit/twitter/bootstrap/layouts.less +0 -16
  175. data/vendor/toolkit/twitter/bootstrap/reset.less +0 -216
  176. data/vendor/toolkit/twitter/bootstrap/responsive-1200px-min.less +0 -28
  177. data/vendor/toolkit/twitter/bootstrap/responsive-767px-max.less +0 -193
  178. data/vendor/toolkit/twitter/bootstrap/responsive-768px-979px.less +0 -19
  179. data/vendor/toolkit/twitter/bootstrap/responsive-navbar.less +0 -189
  180. data/vendor/toolkit/twitter/bootstrap/responsive.less +0 -48
  181. data/vendor/toolkit/twitter/bootstrap/sprites.less +0 -197
@@ -19,9 +19,9 @@ table class="table table-striped"
19
19
  <%- end -%>
20
20
  td=l <%= resource_name %>.created_at
21
21
  td
22
- = link_to t('.edit', :default => t("helpers.links.edit")), edit_<%= singular_controller_routing_path %>_path(<%= resource_name %>), :class => 'btn btn-mini'
22
+ = link_to t('.edit', :default => t("helpers.links.edit")), edit_<%= singular_controller_routing_path %>_path(<%= resource_name %>), :class => 'btn btn-default btn-xs'
23
23
  '
24
- = link_to t('.destroy', :default => t("helpers.links.destroy")), <%= singular_controller_routing_path %>_path(<%= resource_name %>), :method => :delete, :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) }, :class => 'btn btn-mini btn-danger'
24
+ = link_to t('.destroy', :default => t("helpers.links.destroy")), <%= singular_controller_routing_path %>_path(<%= resource_name %>), :method => :delete, :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) }, :class => 'btn btn-xs btn-danger'
25
25
 
26
26
  = link_to t('.new', :default => t("helpers.links.new")), new_<%= singular_controller_routing_path %>_path, :class => 'btn btn-primary'
27
27
 
@@ -10,14 +10,12 @@
10
10
  <%- end -%>
11
11
  </dl>
12
12
 
13
- <div class="form-actions">
14
- <%%= link_to t('.back', :default => t("helpers.links.back")),
15
- <%= controller_routing_path %>_path, :class => 'btn' %>
16
- <%%= link_to t('.edit', :default => t("helpers.links.edit")),
17
- edit_<%= singular_controller_routing_path %>_path(@<%= resource_name %>), :class => 'btn' %>
18
- <%%= link_to t('.destroy', :default => t("helpers.links.destroy")),
13
+ <%%= link_to t('.back', :default => t("helpers.links.back")),
14
+ <%= controller_routing_path %>_path, :class => 'btn btn-default' %>
15
+ <%%= link_to t('.edit', :default => t("helpers.links.edit")),
16
+ edit_<%= singular_controller_routing_path %>_path(@<%= resource_name %>), :class => 'btn btn-default' %>
17
+ <%%= link_to t('.destroy', :default => t("helpers.links.destroy")),
19
18
  <%= singular_controller_routing_path %>_path(@<%= resource_name %>),
20
19
  :method => 'delete',
21
20
  :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) },
22
21
  :class => 'btn btn-danger' %>
23
- </div>
@@ -9,7 +9,7 @@
9
9
  = @<%= resource_name %>.<%= column.name %>
10
10
  <%- end -%>
11
11
 
12
- .form-actions
13
- = link_to t('.back', :default => t("helpers.links.back")), <%= controller_routing_path %>_path, :class => 'btn'
14
- = link_to t('.edit', :default => t("helpers.links.edit")), edit_<%= singular_controller_routing_path %>_path(@<%= resource_name %>), :class => 'btn'
15
- = link_to t('.destroy', :default => t("helpers.links.destroy")), <%= singular_controller_routing_path %>_path(@<%= resource_name %>), :method => "delete", :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) }, :class => 'btn btn-danger'
12
+
13
+ = link_to t('.back', :default => t("helpers.links.back")), <%= controller_routing_path %>_path, :class => 'btn btn-default'
14
+ = link_to t('.edit', :default => t("helpers.links.edit")), edit_<%= singular_controller_routing_path %>_path(@<%= resource_name %>), :class => 'btn btn-default'
15
+ = link_to t('.destroy', :default => t("helpers.links.destroy")), <%= singular_controller_routing_path %>_path(@<%= resource_name %>), :method => "delete", :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) }, :class => 'btn btn-danger'
@@ -9,9 +9,8 @@ p
9
9
  = @<%= resource_name %>.<%= column.name %>
10
10
  <%- end -%>
11
11
 
12
- .form-actions
13
- = link_to t('.back', :default => t("helpers.links.back")), <%= controller_routing_path %>_path, :class => 'btn'
14
- '
15
- = link_to t('.edit', :default => t("helpers.links.edit")), edit_<%= singular_controller_routing_path %>_path(@<%= resource_name %>), :class => 'btn'
16
- '
17
- = link_to t('.destroy', :default => t("helpers.links.destroy")), <%= singular_controller_routing_path %>_path(@<%= resource_name %>), :method => "delete", :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) }, :class => 'btn btn-danger'
12
+ = link_to t('.back', :default => t("helpers.links.back")), <%= controller_routing_path %>_path, :class => 'btn btn-default'
13
+ '
14
+ = link_to t('.edit', :default => t("helpers.links.edit")), edit_<%= singular_controller_routing_path %>_path(@<%= resource_name %>), :class => 'btn btn-default'
15
+ '
16
+ = link_to t('.destroy', :default => t("helpers.links.destroy")), <%= singular_controller_routing_path %>_path(@<%= resource_name %>), :method => "delete", :data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) }, :class => 'btn btn-danger'
@@ -1,14 +1,14 @@
1
1
  <%%= simple_form_for @<%= resource_name %>, :html => { :class => 'form-horizontal' } do |f| %>
2
2
  <%- columns.each do |column| -%>
3
3
  <%%= f.input :<%= column.name %> %>
4
+ <%%= error_span(@<%= resource_name %>[:<%= column.name %>]) %>
4
5
  <%- end -%>
5
6
  <%- if ::SimpleForm::FormBuilder.instance_methods.include?(:wrapped_button) -%>
6
7
  <%%= f.button :wrapped, :cancel => <%= controller_routing_path %>_path %>
7
8
  <%- else -%>
8
- <div class="form-actions">
9
- <%%= f.button :submit, :class => 'btn-primary' %>
10
- <%%= link_to t('.cancel', :default => t("helpers.links.cancel")),
11
- <%= controller_routing_path %>_path, :class => 'btn' %>
12
- </div>
9
+
10
+ <%%= f.button :submit, :class => 'btn-primary' %>
11
+ <%%= link_to t('.cancel', :default => t("helpers.links.cancel")),
12
+ <%= controller_routing_path %>_path, :class => 'btn btn-default' %>
13
13
  <%- end -%>
14
14
  <%% end %>
@@ -1,11 +1,11 @@
1
1
  = simple_form_for @<%= resource_name %>, :html => { :class => 'form-horizontal' } do |f|
2
2
  <%- columns.each do |column| -%>
3
3
  = f.input :<%= column.name %>
4
+ = error_span(@<%= resource_name %>[:<%= column.name %>])
4
5
  <%- end -%>
5
6
  <%- if ::SimpleForm::FormBuilder.instance_methods.include?(:wrapped_button) -%>
6
7
  = f.button :wrapped, :cancel => <%= controller_routing_path %>_path
7
8
  <%- else -%>
8
- .form-actions
9
- = f.button :submit, :class => 'btn-primary'
10
- = link_to t('.cancel', :default => t("helpers.links.cancel")), <%= controller_routing_path %>_path, :class => 'btn'
9
+ = f.button :submit, :class => 'btn-primary'
10
+ = link_to t('.cancel', :default => t("helpers.links.cancel")), <%= controller_routing_path %>_path, :class => 'btn btn-default'
11
11
  <%- end -%>
@@ -1,12 +1,12 @@
1
1
  = simple_form_for @<%= resource_name %>, :html => { :class => "form-horizontal" } do |f|
2
2
  <%- columns.each do |column| -%>
3
3
  = f.input :<%= column.name %>
4
+ = error_span(@<%= resource_name %>[:<%= column.name %>])
4
5
  <%- end -%>
5
6
  <%- if ::SimpleForm::FormBuilder.instance_methods.include?(:wrapped_button) -%>
6
7
  = f.button :wrapped, :cancel => <%= controller_routing_path %>_path
7
8
  <%- else -%>
8
- .form-actions
9
- = f.button :submit, :class => 'btn-primary'
10
- '
11
- = link_to t('.cancel', :default => t("helpers.links.cancel")), <%= controller_routing_path %>_path, :class => 'btn'
9
+ = f.button :submit, :class => 'btn-primary'
10
+ '
11
+ = link_to t('.cancel', :default => t("helpers.links.cancel")), <%= controller_routing_path %>_path, :class => 'btn btn-default'
12
12
  <%- end -%>
@@ -31,11 +31,11 @@ module Bootstrap
31
31
  end
32
32
 
33
33
  def controller_routing_path
34
- @controller_routing_path
34
+ ActiveModel::Naming.route_key(@model_name.constantize)
35
35
  end
36
36
 
37
37
  def singular_controller_routing_path
38
- @controller_routing_path.singularize
38
+ ActiveModel::Naming.singular_route_key(@model_name.constantize)
39
39
  end
40
40
 
41
41
  def model_name
@@ -1,16 +1,15 @@
1
1
  module Twitter
2
2
  module Bootstrap
3
- module BreadCrumbs
3
+ module Breadcrumbs
4
4
  def self.included(base)
5
5
  base.extend(ClassMethods)
6
6
  end
7
7
 
8
8
  module ClassMethods
9
- def add_breadcrumb(name, url, options = {})
10
- class_name = self.name
9
+ def add_breadcrumb(name, url = '', options = {})
10
+ options.merge! :klass => self.name
11
11
  before_filter options do |controller|
12
- name = controller.send :translate_breadcrumb, name, class_name if name.is_a?(Symbol)
13
- controller.send :add_breadcrumb, name, url
12
+ controller.send :add_breadcrumb, name, url, options
14
13
  end
15
14
  end
16
15
  end
@@ -19,9 +18,26 @@ module Twitter
19
18
 
20
19
  def add_breadcrumb(name, url = '', options = {})
21
20
  @breadcrumbs ||= []
22
- name = translate_breadcrumb(name, self.class.name) if name.is_a?(Symbol)
23
- url = eval(url.to_s) if url =~ /_path|_url|@/
24
- @breadcrumbs << {:name => name, :url => url, :options => options}
21
+
22
+ class_name = options.delete(:klass) || self.class.name
23
+
24
+ if name.is_a? Symbol
25
+ if url.blank?
26
+ url_helper = :"#{name}_path"
27
+ url = url_helper if respond_to?(url_helper)
28
+ end
29
+
30
+ name = translate_breadcrumb name, class_name
31
+ end
32
+
33
+ unless name.is_a? String
34
+ url = polymorphic_path name if url.blank?
35
+ name = name.to_s
36
+ end
37
+
38
+ url = eval(url.to_s) if url.is_a?(Symbol) && url =~ /_path|_url|@/
39
+
40
+ @breadcrumbs << {:name => name, :url => url, :options => options}
25
41
  end
26
42
 
27
43
  def translate_breadcrumb(name, class_name)
@@ -1,9 +1,10 @@
1
1
  require 'rails'
2
2
 
3
- require File.dirname(__FILE__) + '/twitter-bootstrap-breadcrumbs.rb'
3
+ require File.dirname(__FILE__) + '/breadcrumbs.rb'
4
4
  require File.dirname(__FILE__) + '/../../../../app/helpers/flash_block_helper.rb'
5
5
  require File.dirname(__FILE__) + '/../../../../app/helpers/modal_helper.rb'
6
6
  require File.dirname(__FILE__) + '/../../../../app/helpers/navbar_helper.rb'
7
+ require File.dirname(__FILE__) + '/../../../../app/helpers/bootstrap_flash_helper.rb'
7
8
 
8
9
  module Twitter
9
10
  module Bootstrap
@@ -19,8 +20,10 @@ module Twitter
19
20
 
20
21
  initializer 'twitter-bootstrap-rails.setup_helpers' do |app|
21
22
  app.config.to_prepare do
22
- ActionController::Base.send :include, BreadCrumbs
23
+ ActionController::Base.send :include, Breadcrumbs
23
24
  ActionController::Base.send :helper, FlashBlockHelper
25
+ ActionController::Base.send :helper, BootstrapFlashHelper
26
+ ActionController::Base.send :helper, FormErrorsHelper
24
27
  ActionController::Base.send :helper, ModalHelper
25
28
  ActionController::Base.send :helper, NavbarHelper
26
29
  ActionController::Base.send :helper, BadgeLabelHelper
@@ -1,7 +1,7 @@
1
1
  module Twitter
2
2
  module Bootstrap
3
3
  module Rails
4
- VERSION = "2.2.8"
4
+ VERSION = "3.2.0"
5
5
  end
6
6
  end
7
- end
7
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe Twitter::Bootstrap::Breadcrumbs do
4
+ class TestModel
5
+ include ActiveModel::Model
6
+
7
+ def to_s
8
+ "test_model"
9
+ end
10
+ end
11
+
12
+ class BaseTestController < AbstractController::Base
13
+ include Twitter::Bootstrap::Breadcrumbs
14
+ include AbstractController::Callbacks
15
+ include AbstractController::UrlFor
16
+
17
+ add_breadcrumb 'base', '/base'
18
+ add_breadcrumb :base_i18n, '/base_i18n'
19
+
20
+ def breadcrumbs
21
+ @breadcrumbs
22
+ end
23
+ end
24
+
25
+ class TestController < BaseTestController
26
+ add_breadcrumb 'class', '/class'
27
+ add_breadcrumb :class_i18n, '/class_i18n'
28
+
29
+ def show
30
+ add_breadcrumb 'instance', '/instance'
31
+ add_breadcrumb :instance_i18n, '/instance_i18n'
32
+
33
+ test_model = TestModel.new
34
+ add_breadcrumb test_model
35
+
36
+ add_breadcrumb :symbolized
37
+ add_breadcrumb :show
38
+ end
39
+
40
+ def symbolized_path
41
+ '/symbolized'
42
+ end
43
+
44
+ def test_models_path
45
+ '/test_model'
46
+ end
47
+ end
48
+
49
+ before do
50
+ options = { :scope => [:breadcrumbs, 'test'] }
51
+ [:class_i18n, :instance_i18n, :show, :symbolized].each do |name|
52
+ I18n.expects(:t).with(name, options).returns(name.to_s)
53
+ end
54
+
55
+ name = :base_i18n
56
+ options = { :scope => [:breadcrumbs, 'base_test'] }
57
+ I18n.expects(:t).with(name, options).returns(name)
58
+
59
+ @controller = TestController.new
60
+ @controller.process(:show)
61
+ end
62
+
63
+ it "have breadcrumbs" do
64
+ [:base, :base_i18n, :class, :class_i18n, :instance, :instance_i18n, :test_model, :symbolized].each do |name|
65
+ path = "/#{name}"
66
+ idx = @controller.breadcrumbs.index { |b| b[:name] == name.to_s && b[:url] == path }
67
+ idx.should be, -> { name }
68
+ end
69
+
70
+ idx = @controller.breadcrumbs.index { |b| b[:name] == "show" && b[:url] == '' }
71
+ idx.should be
72
+ end
73
+
74
+ end
@@ -10,11 +10,13 @@ include BadgeLabelHelper
10
10
 
11
11
  describe BadgeLabelHelper, :type => :helper do
12
12
  it "should return a basic bootstrap badge" do
13
- badge('test').gsub(/\s/, '').downcase.should eql(BASIC_BADGE.gsub(/\s/, '').downcase)
13
+ expect(badge('test').gsub(/\s/, '').downcase)
14
+ .to eql(BASIC_BADGE.gsub(/\s/, '').downcase)
14
15
  end
15
16
 
16
17
  it "should return a bootstrap badge with class" do
17
- badge('waning', :warning).gsub(/\s/, '').downcase.should eql(BADGE_WITH_CLASS.gsub(/\s/, '').downcase)
18
+ expect(badge('waning', :warning).gsub(/\s/, '').downcase)
19
+ .to eql(BADGE_WITH_CLASS.gsub(/\s/, '').downcase)
18
20
  end
19
21
  end
20
22
 
@@ -11,49 +11,49 @@ describe ModalHelper, :type => :helper do
11
11
  header_without_close = { :show_close => false, :title => 'Modal header' }
12
12
  options = { :id => "modal",
13
13
  :header => header_with_close,
14
- :body => 'This is the body',
15
- :footer => content_tag(:button, 'Save', :class => 'btn')
14
+ :body => { content: 'This is the body' },
15
+ :footer => { content: content_tag(:button, 'Save', :class => 'btn') }
16
16
  }
17
17
 
18
18
  it 'returns a complete modal' do
19
- modal_dialog(options).gsub(/\n/, "").should eql BASIC_MODAL.gsub(/\n/, "")
19
+ expect(modal_dialog(options).gsub(/\n/, "")).to eql BASIC_MODAL.gsub(/\n/, "")
20
20
  end
21
21
 
22
22
  it 'returns a modal header with a close button if show_close is true' do
23
- modal_header(header_with_close).gsub(/\n/, "").should eql MODAL_HEADER_WITH_CLOSE.gsub(/\n/, "")
23
+ expect(modal_header(header_with_close).gsub(/\n/, "")).to eql MODAL_HEADER_WITH_CLOSE.gsub(/\n/, "")
24
24
  end
25
25
 
26
26
  it 'renders a modal header without a close button' do
27
- modal_header(header_without_close).gsub(/\n/, "").should eql MODAL_HEADER_WITHOUT_CLOSE.gsub(/\n/, "")
27
+ expect(modal_header(header_without_close).gsub(/\n/, "")).to eql MODAL_HEADER_WITHOUT_CLOSE.gsub(/\n/, "")
28
28
  end
29
29
 
30
30
  it 'renders a close button' do
31
- close_button('modal').should eql "<button class=\"close\" data-dismiss=\"modal\">&times;</button>"
31
+ expect(close_button('modal')).to eql "<button class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>"
32
32
  end
33
33
 
34
34
  it 'renders a modal toggle button' do
35
- modal_toggle('Save', :href => "#modal").gsub(/\n/, "").should eql MODAL_TOGGLE.gsub(/\n/, "")
35
+ expect(modal_toggle('Save', :href => "#modal").gsub(/\n/, "")).to eql MODAL_TOGGLE.gsub(/\n/, "")
36
36
  end
37
37
 
38
- it 'renders a cancel button' do
39
- modal_cancel_button("Cancel", :href => "#modal", :data => {:dismiss => 'modal'}).gsub(/\n/, "").should eql MODAL_CANCEL_BUTTON.gsub(/\n/, "")
40
- end
41
-
38
+ it 'renders a cancel button' do
39
+ expect(modal_cancel_button("Cancel", :href => "#modal", :data => {:dismiss => 'modal'}).gsub(/\n/, "")).to eql MODAL_CANCEL_BUTTON.gsub(/\n/, "")
40
+ end
42
41
  end
42
+
43
43
  BASIC_MODAL = <<-HTML
44
- <div class=\"bootstrap-modal modal hide fade\" id="modal"><div class=\"modal-header\"><button class=\"close\" data-dismiss=\"modal\">&times;</button><h3>Modal header</h3></div><div class=\"modal-body\">This is the body</div><div class=\"modal-footer\"><button class=\"btn\">Save</button></div></div>
44
+ <div class=\"bootstrap-modal modal fade\" id=\"modal\"><div class=\"modal-dialog \"><div class=\"modal-content\"><div class=\"modal-header\"><button class=\"close\" data-dismiss=\"true\" aria-hidden=\"true\">&times;</button><h4 class=\"modal-title\"></h4></div><div class=\"modal-body\"></div><div class=\"modal-footer\"></div></div></div></div>
45
45
  HTML
46
46
 
47
47
  MODAL_HEADER_WITHOUT_CLOSE = <<-HTML
48
- <div class="modal-header"><h3>Modal header</h3></div>
48
+ <div class="modal-header"><h4 class=\"modal-title\">Modal header</h4></div>
49
49
  HTML
50
50
 
51
51
  MODAL_HEADER_WITH_CLOSE = <<-HTML
52
- <div class="modal-header"><button class="close" data-dismiss="modal">&times;</button><h3>Modal header</h3></div>
52
+ <div class="modal-header"><button class="close" data-dismiss="modal" aria-hidden=\"true\">&times;</button><h4 class=\"modal-title\">Modal header</h4></div>
53
53
  HTML
54
54
 
55
55
  MODAL_TOGGLE = <<-HTML
56
- <a class="btn" data-toggle="modal" href="#modal">Save</a>
56
+ <a class="btn btn-default" data-toggle="modal" href="#modal">Save</a>
57
57
  HTML
58
58
 
59
59
  MODAL_CANCEL_BUTTON = <<-HTML
@@ -11,161 +11,182 @@ include NavbarHelper
11
11
 
12
12
  describe NavbarHelper, :type => :helper do
13
13
  before do
14
- self.stub!("uri_state").and_return(:inactive)
15
- self.stub!("root_url").and_return("/")
14
+ allow(self).to receive(:uri_state) { :inactive }
15
+ allow(self).to receive(:root_url) { '/' }
16
16
  end
17
17
  describe "nav_bar" do
18
18
  it "should return a basic bootstrap navbar" do
19
- nav_bar.gsub(/\s/, '').downcase.should eql(BASIC_NAVBAR.gsub(/\s/, '').downcase)
19
+ expect(nav_bar.gsub(/\s/, '').downcase)
20
+ .to eql(BASIC_NAVBAR.gsub(/\s/, '').downcase)
20
21
  end
21
22
 
22
23
  it "should set the fixed position to top" do
23
- nav_bar(:fixed => :top).gsub(/\s/, '').downcase.should eql(FIXED_TOP_NAVBAR.gsub(/\s/, '').downcase)
24
+ expect(nav_bar(:fixed => :top).gsub(/\s/, '').downcase)
25
+ .to eql(FIXED_TOP_NAVBAR.gsub(/\s/, '').downcase)
24
26
  end
25
27
 
26
28
  it "should set the static position to top" do
27
- nav_bar(:static => :top).gsub(/\s/, '').downcase.should eql(STATIC_TOP_NAVBAR.gsub(/\s/, '').downcase)
29
+ expect(nav_bar(:static => :top).gsub(/\s/, '').downcase)
30
+ .to eql(STATIC_TOP_NAVBAR.gsub(/\s/, '').downcase)
28
31
  end
29
32
 
30
33
  it "should set the fixed position to bottom" do
31
- nav_bar(:fixed => :bottom).gsub(/\s/, '').downcase.should eql(FIXED_BOTTOM_NAVBAR.gsub(/\s/, '').downcase)
34
+ expect(nav_bar(:fixed => :bottom).gsub(/\s/, '').downcase)
35
+ .to eql(FIXED_BOTTOM_NAVBAR.gsub(/\s/, '').downcase)
32
36
  end
33
37
 
34
38
  it "should set the style to inverse" do
35
- nav_bar(:inverse => true).gsub(/\s/, '').downcase.should eql(INVERSE_NAVBAR.gsub(/\s/, '').downcase)
39
+ expect(nav_bar(:inverse => true).gsub(/\s/, '').downcase)
40
+ .to eql(INVERSE_NAVBAR.gsub(/\s/, '').downcase)
36
41
  end
37
42
 
38
43
  it "should add the brand name and link it to the home page" do
39
- nav_bar(:brand => "Ninety Ten").gsub(/\s/, '').downcase.should eql(NAVBAR_WITH_BRAND.gsub(/\s/, '').downcase)
44
+ expect(nav_bar(:brand => "Ninety Ten").gsub(/\s/, '').downcase)
45
+ .to eql(NAVBAR_WITH_BRAND.gsub(/\s/, '').downcase)
40
46
  end
41
47
 
42
48
  it "should be able to set the brand link url" do
43
- nav_bar(:brand => "Ninety Ten", :brand_link => "http://www.ninetyten.com").gsub(/\s/, '').downcase.should eql(NAVBAR_WITH_BRAND_AND_LINK.gsub(/\s/, '').downcase)
44
- end
45
-
46
- it "should set the container to fluid" do
47
- nav_bar(:fluid => :true).gsub(/\s/, '').downcase.should eql(BASIC_NAVBAR_FLUID.gsub(/\s/, '').downcase)
49
+ expect(nav_bar(:brand => "Ninety Ten", :brand_link => "http://www.ninetyten.com").gsub(/\s/, '').downcase)
50
+ .to eql(NAVBAR_WITH_BRAND_AND_LINK.gsub(/\s/, '').downcase)
48
51
  end
49
52
 
50
53
  it "should add the buttons etc for a responsive layout with no block passed" do
51
- nav_bar(:responsive => true).gsub(/\s/, '').downcase.should eql(RESPONSIVE_NAVBAR.gsub(/\s/, '').downcase)
54
+ expect(nav_bar(:responsive => true).gsub(/\s/, '').downcase).to eql(RESPONSIVE_NAVBAR.gsub(/\s/, '').downcase)
52
55
  end
53
56
 
54
57
  it "should add the buttons etc for a responsive layout with block passed" do
55
- nav_bar(:responsive => true) do
58
+ ele = nav_bar(:responsive => true) do
56
59
  "<p>Passing a block</p>".html_safe
57
- end.gsub(/\s/, '').downcase.should eql(RESPONSIVE_NAVBAR_WITH_BLOCK.gsub(/\s/, '').downcase)
60
+ end
61
+ expect(ele.gsub(/\s/, '').downcase).to eql(RESPONSIVE_NAVBAR_WITH_BLOCK.gsub(/\s/, '').downcase)
58
62
  end
59
63
 
60
64
  it "should render contained items" do
61
- nav_bar do
65
+ ele = nav_bar do
62
66
  menu_group do
63
67
  menu_item("Home", "/") + menu_item("Products", "/products")
64
68
  end
65
- end.gsub(/\s/, '').downcase.should eql(PLAIN_NAVBAR_WITH_ITEM.gsub(/\s/, '').downcase)
69
+ end
70
+ expect(ele.gsub(/\s/, '').downcase).to eql(PLAIN_NAVBAR_WITH_ITEM.gsub(/\s/, '').downcase)
66
71
  end
67
72
 
68
73
  it "should still render the brand name even with other options turned on" do
69
- nav_bar(:brand => "Something") do
74
+ ele = nav_bar(:brand => "Something") do
70
75
  menu_group do
71
76
  menu_item "Home", "/"
72
77
  end
73
- end.gsub(/\s/, '').downcase.should eql(BRANDED_NAVBAR_WITH_ITEM.gsub(/\s/, '').downcase)
78
+ end
79
+ expect(ele.gsub(/\s/, '').downcase).to eql(BRANDED_NAVBAR_WITH_ITEM.gsub(/\s/, '').downcase)
74
80
  end
75
81
  end
76
82
 
77
83
  describe "menu_group" do
78
84
  it "should return a ul with the class 'nav'" do
79
- menu_group do
85
+ ele = menu_group do
80
86
  menu_item("Home", "/") + menu_item("Products", "/products")
81
- end.should eql '<ul class="nav "><li><a href="/">Home</a></li><li><a href="/products">Products</a></li></ul>'
87
+ end
88
+ expect(ele).to eql '<ul class="nav navbar-nav "><li><a href="/">Home</a></li><li><a href="/products">Products</a></li></ul>'
82
89
  end
83
90
 
84
- it "should return a ul with class .pull-left when passed the {:pull => :left} option" do
85
- menu_group(:pull => :left) do
91
+ it "should return a ul with class .navbar-left when passed the {:pull => :left} option" do
92
+ ele = menu_group(:pull => :left) do
86
93
  menu_item("Home", "/")
87
- end.should eql('<ul class="nav pull-left"><li><a href="/">Home</a></li></ul>')
94
+ end
95
+ expect(ele).to eql('<ul class="nav navbar-nav navbar-left"><li><a href="/">Home</a></li></ul>')
88
96
  end
89
97
  end
90
98
 
91
99
  describe "menu_item" do
92
100
  it "should return a link within an li tag" do
93
- self.stub!("current_page?").and_return(false)
94
- menu_item("Home", "/").should eql('<li><a href="/">Home</a></li>')
101
+ allow(self).to receive(:current_page?) { false }
102
+ expect(menu_item("Home", "/")).to eql('<li><a href="/">Home</a></li>')
95
103
  end
96
104
  it "should return the link with class 'active' if on current page" do
97
- self.stub!("uri_state").and_return(:active)
98
- menu_item("Home", "/").should eql('<li class="active"><a href="/">Home</a></li>')
105
+ allow(self).to receive(:uri_state) { :active }
106
+ expect(menu_item("Home", "/")).to eql('<li class="active"><a href="/">Home</a></li>')
99
107
  end
100
108
  it "should pass any other options through to the link_to method" do
101
- self.stub!("uri_state").and_return(:active)
102
- menu_item("Log out", "/users/sign_out", :class => "home_link", :method => :delete).should eql('<li class="active"><a href="/users/sign_out" class="home_link" data-method="delete" rel="nofollow">Log out</a></li>')
109
+ self.stub("uri_state").and_return(:active)
110
+ expect(menu_item("Log out", "/users/sign_out", :class => "home_link", :method => :delete)).to eql('<li class="active"><a class="home_link" data-method="delete" href="/users/sign_out" rel="nofollow">Log out</a></li>')
103
111
  end
104
112
  it "should pass a block but no name if a block is present" do
105
- self.stub!("current_page?").and_return(false)
106
- menu_item("/"){content_tag("i", "", :class => "icon-home") + " Home"}.should eql('<li><a href="/"><i class="icon-home"></i> Home</a></li>')
113
+ allow(self).to receive(:current_page?) { false }
114
+ expect(menu_item("/"){content_tag("i", "", :class => "icon-home") + " Home"}).to eql('<li><a href="/"><i class="icon-home"></i> Home</a></li>')
107
115
  end
108
116
  it "should work with just a block" do
109
- self.stub!("current_page?").and_return(false)
110
- menu_item{ content_tag("i", "", :class => "icon-home") + " Home" }.should eql('<li><a href="#"><i class="icon-home"></i> Home</a></li>')
117
+ allow(self).to receive(:current_page?) { false }
118
+ expect(menu_item{ content_tag("i", "", :class => "icon-home") + " Home" }).to eql('<li><a href="#"><i class="icon-home"></i> Home</a></li>')
111
119
  end
112
120
  it "should return the link with class 'active' if on current page with a block" do
113
- self.stub!("uri_state").and_return(:active)
114
- menu_item("/"){ content_tag("i", "", :class => "icon-home") + " Home" }.should eql('<li class="active"><a href="/"><i class="icon-home"></i> Home</a></li>')
121
+ allow(self).to receive(:uri_state) { :active }
122
+ expect(menu_item("/"){ content_tag("i", "", :class => "icon-home") + " Home" }).to eql('<li class="active"><a href="/"><i class="icon-home"></i> Home</a></li>')
115
123
  end
116
124
  end
117
125
 
118
126
  describe "drop_down" do
119
127
  it "should do render the proper drop down code" do
120
- drop_down "Products" do
128
+ ele = drop_down "Products" do
121
129
  menu_item "Latest", "/"
122
- end.gsub(/\s/, '').downcase.should eql(DROPDOWN_MENU.gsub(/\s/, '').downcase)
130
+ end
131
+ expect(ele).to have_tag(:li, with: {class: 'dropdown'})
132
+ expect(ele).to have_tag(:a, with: {class: 'dropdown-toggle'})
123
133
  end
124
134
  end
125
135
 
126
136
  describe "drop_down_with_submenu" do
127
137
  it "should do render the proper drop down code" do
128
- drop_down_with_submenu "Products" do
129
- drop_down_submenu "Latest" do
130
- menu_item "Option1", "/"
138
+ ele = drop_down_with_submenu "Products" do
139
+ drop_down_submenu "Latest" do
140
+ menu_item "Option1", "/"
141
+ end
131
142
  end
132
- end.gsub(/\s/, '').downcase.should eql(DROPDOWN_MENU_WITH_SUBMENU.gsub(/\s/, '').downcase)
143
+ expect(ele).to have_tag(:li, with: {class: 'dropdown'})
144
+ expect(ele).to have_tag(:a, with: {class: 'dropdown-toggle'})
145
+ expect(ele).to have_tag(:ul, with: {class: 'dropdown-menu'})
133
146
  end
134
147
  end
135
148
 
136
149
  describe "menu_divider" do
137
150
  it "should render <li class='divider-vertical'></li>" do
138
- menu_divider.should eql '<li class="divider-vertical"></li>'
151
+ expect(menu_divider).to match '<li class="divider-vertical"></li>'
139
152
  end
140
153
  end
141
154
 
142
155
  describe "menu_text" do
143
156
  it "should render text within p tags with class 'navbar-text" do
144
- menu_text("Strapline!").should eql("<p class=\"navbar-text\">Strapline!</p>")
157
+ expect(menu_text("Strapline!")).to match("<p class=\"navbar-text\">Strapline!</p>")
145
158
  end
146
159
 
147
160
  it "should be able to be pulled right or left" do
148
- menu_text("I am being pulled right", :pull => :right).should eql("<p class=\"pull-right navbar-text\">I am being pulled right</p>")
161
+ expect(menu_text("I am being pulled right", :pull => :right)).to match("<p class=\"pull-right navbar-text\">I am being pulled right</p>")
149
162
  end
150
163
 
151
164
  it "should be able to cope with arbitrary options being passed to the p tag" do
152
- menu_text("I am classy!", :class => "classy", :id => "classy_text").should eql("<p class=\"classy navbar-text\" id=\"classy_text\">I am classy!</p>")
165
+ expect(menu_text("I am classy!", :class => "classy", :id => "classy_text")).to match("<p class=\"classy navbar-text\" id=\"classy_text\">I am classy!</p>")
153
166
  end
154
167
 
155
168
  it "should be able to cope with a block too" do
156
- menu_text do
157
- "I have been rendered programmatically!"
158
- end.should eql("<p class=\"navbar-text\">I have been rendered programmatically!</p>")
169
+ ele = menu_text("I have been rendered programmatically!")
170
+ expect(ele).to have_tag(:p, with: {class: "navbar-text"})
171
+ expect(ele).to match "I have been rendered programmatically!"
159
172
  end
160
173
  end
161
174
 
162
175
  describe "rendering forms ok" do
163
176
  it "should not escape anything unexpectedly" do
164
- nav_bar do
165
- form_tag "/", :method => 'get' do |f|
166
- f.text_field :search, "stub"
177
+ expect(
178
+ nav_bar do
179
+ form_tag "/", :method => 'get' do |f|
180
+ f.text_field :search, "stub"
181
+ end
167
182
  end
168
- end.gsub(/\s/, '').downcase.should eql(PLAIN_NAVBAR_WITH_FORM.gsub(/\s/, '').downcase)
183
+ ).to have_tag(:form)
184
+ end
185
+ end
186
+
187
+ describe "default navbar" do
188
+ it "renders a navbar" do
189
+ expect(nav_bar { 'foo' }).to have_tag(:nav, with: { class: 'navbar navbar-default', role: 'navigation' }, text: /foo/)
169
190
  end
170
191
  end
171
192
 
@@ -174,167 +195,132 @@ end
174
195
  # HTML output
175
196
 
176
197
  BASIC_NAVBAR = <<-HTML
177
- <div class="navbar">
178
- <div class="navbar-inner">
179
- <div class="container">
180
- </div>
198
+ <nav class="navbar navbar-default" role="navigation">
199
+ <div class="container">
181
200
  </div>
182
- </div>
201
+ </nav>
183
202
  HTML
184
203
 
185
204
  FIXED_TOP_NAVBAR = <<-HTML
186
- <div class="navbar navbar-fixed-top">
187
- <div class="navbar-inner">
188
- <div class="container">
189
- </div>
205
+ <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
206
+ <div class="container">
190
207
  </div>
191
- </div>
208
+ </nav>
192
209
  HTML
193
210
 
194
211
  STATIC_TOP_NAVBAR = <<-HTML
195
- <div class="navbar navbar-static-top">
196
- <div class="navbar-inner">
197
- <div class="container">
198
- </div>
212
+ <nav class="navbar navbar-default navbar-static-top" role="navigation">
213
+ <div class="container">
199
214
  </div>
200
- </div>
215
+ </nav>
201
216
  HTML
202
217
 
203
218
  FIXED_BOTTOM_NAVBAR = <<-HTML
204
- <div class="navbar navbar-fixed-bottom">
205
- <div class="navbar-inner">
206
- <div class="container">
207
- </div>
219
+ <nav class="navbar navbar-default navbar-fixed-bottom" role="navigation">
220
+ <div class="container">
208
221
  </div>
209
- </div>
222
+ </nav>
210
223
  HTML
211
224
 
212
225
  INVERSE_NAVBAR = <<-HTML
213
- <div class="navbar navbar-inverse">
214
- <div class="navbar-inner">
215
- <div class="container">
216
- </div>
217
- </div>
218
- </div>
219
- HTML
220
-
221
- BASIC_NAVBAR_FLUID= <<-HTML
222
- <div class="navbar">
223
- <div class="navbar-inner">
224
- <div class="container-fluid">
225
- </div>
226
+ <nav class="navbar navbar-default navbar-inverse" role="navigation">
227
+ <div class="container">
226
228
  </div>
227
- </div>
229
+ </nav>
228
230
  HTML
229
231
 
230
232
  NAVBAR_WITH_BRAND = <<-HTML
231
- <div class="navbar">
232
- <div class="navbar-inner">
233
- <div class="container">
234
- <a href="/" class="brand">
235
- Ninety Ten
236
- </a>
237
- </div>
233
+ <nav class="navbar navbar-default" role="navigation">
234
+ <div class="container">
235
+ <a class="navbar-brand" href="/">
236
+ Ninety Ten
237
+ </a>
238
238
  </div>
239
- </div>
239
+ </nav>
240
240
  HTML
241
241
 
242
242
  NAVBAR_WITH_BRAND_AND_LINK = <<-HTML
243
- <div class="navbar">
244
- <div class="navbar-inner">
245
- <div class="container">
246
- <a href="http://www.ninetyten.com" class="brand">
247
- Ninety Ten
248
- </a>
249
- </div>
243
+ <nav class="navbar navbar-default" role="navigation">
244
+ <div class="container">
245
+ <a class="navbar-brand" href="http://www.ninetyten.com">
246
+ Ninety Ten
247
+ </a>
250
248
  </div>
251
- </div>
249
+ </nav>
252
250
  HTML
253
251
 
254
252
  RESPONSIVE_NAVBAR = <<-HTML
255
- <div class="navbar">
256
- <div class="navbar-inner">
257
- <div class="container">
258
- <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
253
+ <nav class="navbar navbar-default" role="navigation">
254
+ <div class="container">
255
+ <div class="navbar-header">
256
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
257
+ <span class="sr-only">Toggle Navigation</span>
259
258
  <span class="icon-bar"></span>
260
259
  <span class="icon-bar"></span>
261
260
  <span class="icon-bar"></span>
262
- </a>
263
- <div class="nav-collapse">
264
- </div>
261
+ </button>
262
+ </div>
263
+ <div class="navbar-collapse collapse">
265
264
  </div>
266
265
  </div>
267
- </div>
266
+ </nav>
268
267
  HTML
269
268
 
270
269
  RESPONSIVE_NAVBAR_WITH_BLOCK = <<-HTML
271
- <div class="navbar">
272
- <div class="navbar-inner">
273
- <div class="container">
274
- <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
270
+ <nav class="navbar navbar-default" role="navigation">
271
+ <div class="container">
272
+ <div class="navbar-header">
273
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
274
+ <span class="sr-only">Toggle Navigation</span>
275
275
  <span class="icon-bar"></span>
276
276
  <span class="icon-bar"></span>
277
277
  <span class="icon-bar"></span>
278
- </a>
279
- <div class="nav-collapse">
280
- <p>Passing a block</p>
281
- </div>
278
+ </button>
279
+ </div>
280
+ <div class="navbar-collapse collapse">
281
+ <p>Passing a block</p>
282
282
  </div>
283
283
  </div>
284
- </div>
284
+ </nav>
285
285
  HTML
286
286
 
287
287
  PLAIN_NAVBAR_WITH_ITEM = <<-HTML
288
- <div class="navbar">
289
- <div class="navbar-inner">
290
- <div class="container">
291
- <ul class="nav">
292
- <li>
293
- <a href="/">Home</a>
294
- </li>
295
- <li>
296
- <a href="/products">Products</a>
297
- </li>
298
- </ul>
299
- </div>
300
- </div>
301
- </div>
288
+ <nav class="navbar navbar-default" role="navigation">
289
+ <div class="container">
290
+ <ul class="nav navbar-nav">
291
+ <li>
292
+ <a href="/">Home</a>
293
+ </li>
294
+ <li>
295
+ <a href="/products">Products</a>
296
+ </li>
297
+ </ul>
298
+ </div>
299
+ </nav>
302
300
  HTML
303
301
 
304
302
  BRANDED_NAVBAR_WITH_ITEM = <<-HTML
305
- <div class="navbar">
306
- <div class="navbar-inner">
307
- <div class="container">
308
- <a href="/" class="brand">
309
- Something
310
- </a>
311
- <ul class="nav">
312
- <li>
313
- <a href="/">Home</a>
314
- </li>
315
- </ul>
316
- </div>
317
- </div>
318
- </div>
303
+ <nav class="navbar navbar-default" role="navigation">
304
+ <div class="container">
305
+ <a class="navbar-brand" href="/">
306
+ Something
307
+ </a>
308
+ <ul class="nav navbar-nav">
309
+ <li>
310
+ <a href="/">Home</a>
311
+ </li>
312
+ </ul>
313
+ </div>
314
+ </nav>
319
315
  HTML
320
316
 
321
317
  DROPDOWN_MENU = <<-HTML
322
- <li class="dropdown">
323
- <a href="#"
324
- class="dropdown-toggle"
325
- data-toggle="dropdown">
326
- Products
327
- <b class="caret"></b>
328
- </a>
329
- <ul class="dropdown-menu">
330
- <li><a href="/">Latest</a></li>
331
- </ul>
332
- </li>
318
+ <li class="dropdown"> <a class="dropdown-toggle"data-toggle="dropdown"href="#"> Products <b class="caret"></b> </a> <ul class="dropdown-menu"> <li><a href="/">Latest</a></li> </ul> </li>
333
319
  HTML
334
320
 
335
321
  DROPDOWN_MENU_WITH_SUBMENU = <<-HTML
336
322
  <li class="dropdown">
337
- <a href="#" class="dropdown-toggle" data-toggle="dropdown">Products <b class="caret"></b></a>
323
+ <a class="dropdown-toggle" data-toggle="dropdown" href="#">Products <b class="caret"></b></a>
338
324
  <ul class="dropdown-menu">
339
325
  <li class="dropdown-submenu">
340
326
  <a href="">Latest</a>
@@ -347,16 +333,14 @@ DROPDOWN_MENU_WITH_SUBMENU = <<-HTML
347
333
  HTML
348
334
 
349
335
  PLAIN_NAVBAR_WITH_FORM = <<-HTML
350
- <div class="navbar">
351
- <div class="navbar-inner">
352
- <div class="container">
353
- <form accept-charset="utf-8" action="/" method="get">
354
- <div style="margin:0;padding:0;display:inline">
355
- <input name="utf8" type="hidden" value="&#x2713;"/>
356
- </div>
357
- <input id="search_stub" name="search[stub]" size="30" type="text"/>
358
- </form>
359
- </div>
360
- </div>
361
- </div>
336
+ <nav class=\"navbar navbar-default\"role=\"navigation\">
337
+ <div class=\"container\">
338
+ <form accept-charset=\"utf-8\" action=\"/\" method=\"get\">
339
+ <div style=\"display:none\">
340
+ <input name=\"utf8\" type=\"hidden\" value=\"&#x2713;\"/>
341
+ </div>
342
+ <input id=\"search_stub\" name=\"search[stub]\" type=\"text\"/>
343
+ </form>
344
+ </div>
345
+ </nav>
362
346
  HTML