loaf 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -3
  3. data/.rspec +1 -0
  4. data/.travis.yml +30 -12
  5. data/Appraisals +27 -9
  6. data/CHANGELOG.md +59 -11
  7. data/Gemfile +11 -11
  8. data/Gemfile.lock +182 -0
  9. data/README.md +120 -56
  10. data/assets/loaf_logo.png +0 -0
  11. data/bin/appraisal +16 -0
  12. data/bin/rake +16 -0
  13. data/gemfiles/rails3.2.gemfile +15 -13
  14. data/gemfiles/rails4.0.gemfile +13 -12
  15. data/gemfiles/rails4.1.gemfile +14 -13
  16. data/gemfiles/rails4.2.gemfile +14 -13
  17. data/gemfiles/rails5.0.gemfile +22 -0
  18. data/gemfiles/rails5.1.gemfile +22 -0
  19. data/lib/loaf.rb +2 -22
  20. data/lib/loaf/breadcrumb.rb +30 -0
  21. data/lib/loaf/configuration.rb +7 -8
  22. data/lib/loaf/controller_extensions.rb +13 -28
  23. data/lib/loaf/crumb.rb +5 -4
  24. data/lib/loaf/crumb_formatter.rb +3 -1
  25. data/lib/loaf/errors.rb +1 -3
  26. data/lib/loaf/options_validator.rb +2 -2
  27. data/lib/loaf/railtie.rb +19 -13
  28. data/lib/loaf/translation.rb +1 -1
  29. data/lib/loaf/version.rb +1 -3
  30. data/lib/loaf/view_extensions.rb +69 -18
  31. data/loaf.gemspec +20 -13
  32. data/spec/integration/{crumbs_routing_spec.rb → breadcrumb_trail_spec.rb} +19 -12
  33. data/spec/rails_app/app/controllers/application_controller.rb +2 -0
  34. data/spec/rails_app/app/controllers/posts_controller.rb +1 -4
  35. data/spec/rails_app/app/views/layouts/_breadcrumbs.html.erb +7 -5
  36. data/spec/rails_app/app/views/layouts/application.html.erb +0 -2
  37. data/spec/rails_app/config/environments/test.rb +1 -1
  38. data/spec/rails_app/config/secrets.yml +22 -0
  39. data/spec/spec_helper.rb +3 -3
  40. data/spec/support/dummy_controller.rb +9 -0
  41. data/spec/support/dummy_view.rb +42 -2
  42. data/spec/unit/configuration_spec.rb +35 -0
  43. data/spec/unit/controller_extensions_spec.rb +5 -14
  44. data/spec/unit/generators/install_generator_spec.rb +2 -1
  45. data/spec/unit/view_extensions/breadcrumb_trail_spec.rb +232 -0
  46. metadata +65 -31
  47. data/.ruby-version +0 -1
  48. data/init.rb +0 -3
  49. data/lib/loaf/builder.rb +0 -38
  50. data/spec/rails_app/.gitignore +0 -5
  51. data/spec/rails_app/lib/assets/.gitkeep +0 -0
  52. data/spec/rails_app/lib/tasks/.gitkeep +0 -0
  53. data/spec/rails_app/script/rails +0 -6
  54. data/spec/unit/view_extensions/breadcrumbs_spec.rb +0 -128
data/README.md CHANGED
@@ -1,27 +1,32 @@
1
+ <div align="center">
2
+ <img width="237" src="https://cdn.rawgit.com/piotrmurach/loaf/master/assets/loaf_logo.png" alt="loaf logo" />
3
+ </div>
4
+
1
5
  # Loaf
2
- [![Gem Version](https://badge.fury.io/rb/loaf.png)][gem]
3
- [![Build Status](https://secure.travis-ci.org/peter-murach/loaf.png?branch=master)][travis]
4
- [![Code Climate](https://codeclimate.com/github/peter-murach/loaf.png)][codeclimate]
5
- [![Dependency Status](https://gemnasium.com/peter-murach/loaf.png?travis)][gemnasium]
6
- [![Coverage Status](https://coveralls.io/repos/peter-murach/loaf/badge.png?branch=master)][coveralls]
7
- [![Inline docs](http://inch-ci.org/github/peter-murach/loaf.png?branch=master)][inchpages]
6
+
7
+ [![Gem Version](https://badge.fury.io/rb/loaf.svg)][gem]
8
+ [![Build Status](https://secure.travis-ci.org/piotrmurach/loaf.svg?branch=master)][travis]
9
+ [![Code Climate](https://codeclimate.com/github/piotrmurach/loaf/badges/gpa.svg)][codeclimate]
10
+ [![Dependency Status](https://gemnasium.com/piotrmurach/loaf.svg?travis)][gemnasium]
11
+ [![Coverage Status](https://coveralls.io/repos/github/piotrmurach/loaf/badge.svg?branch=master)][coveralls]
12
+ [![Inline docs](http://inch-ci.org/github/piotrmurach/loaf.svg?branch=master)][inchpages]
8
13
 
9
14
  [gem]: http://badge.fury.io/rb/loaf
10
- [travis]: http://travis-ci.org/peter-murach/loaf
11
- [codeclimate]: https://codeclimate.com/github/peter-murach/loaf
12
- [gemnasium]: https://gemnasium.com/peter-murach/loaf
13
- [coveralls]: https://coveralls.io/r/peter-murach/loaf
14
- [inchpages]: http://inch-ci.org/github/peter-murach/loaf
15
+ [travis]: http://travis-ci.org/piotrmurach/loaf
16
+ [codeclimate]: https://codeclimate.com/github/piotrmurach/loaf
17
+ [gemnasium]: https://gemnasium.com/piotrmurach/loaf
18
+ [coveralls]: https://coveralls.io/github/piotrmurach/loaf
19
+ [inchpages]: http://inch-ci.org/github/piotrmurach/loaf
15
20
 
16
21
  > **Loaf** manages and displays breadcrumb trails in your Rails application.
17
22
 
18
23
  ## Features
19
24
 
20
- * Uses controllers or views to specify breadcrumb trails
25
+ * Use controllers and/or views to specify breadcrumb trails
21
26
  * Specify urls using Rails conventions
22
- * No markup assumptions for breadcrumbs rendering
27
+ * No markup assumptions for breadcrumbs trails rendering
23
28
  * Use locales file for breadcrumb names
24
- * Tested with Rails 3.2, 4.0, 4.1, 4.2
29
+ * Tested with Rails `>= 3.2` and Ruby `>= 2.0.0`
25
30
 
26
31
  ## Installation
27
32
 
@@ -49,11 +54,23 @@ Then run the generator:
49
54
  rails generate loaf:install
50
55
  ```
51
56
 
57
+ ## Contents
58
+
59
+ * [1. Usage](#1-usage)
60
+ * [2. API](#2-api)
61
+ * [2.1 breadcrumb](#21-breadcrumb)
62
+ * [2.1.1 controller](#211-controller)
63
+ * [2.1.2 view](#212-view)
64
+ * [2.1.3 :match](#213-match)
65
+ * [2.2 breadcrumb_trail](#22-breadcrumb_trail)
66
+ * [3. Configuration](#3-configuration)
67
+ * [4. Translation](#4-translation)
68
+
52
69
  ## 1. Usage
53
70
 
54
71
  **Loaf** allows you to add breadcrumbs in controllers and views.
55
72
 
56
- In order to add breadcrumbs in controller use `breadcrumb` method ([see 1.1](#11-breadcrumb)). Outside of controller actions the `breadcrumb` helper behaviour is similar to filters and as such you can limit breadcrumb scope with familiar options `:only`, `:except`. Any breadcrumb specified inside actions creates another level in breadcrumbs trail.
73
+ In order to add breadcrumbs in controller use `breadcrumb` method ([see 2.1](#21-breadcrumb)).
57
74
 
58
75
  ```ruby
59
76
  class Blog::CategoriesController < ApplicationController
@@ -66,28 +83,11 @@ class Blog::CategoriesController < ApplicationController
66
83
  end
67
84
  ```
68
85
 
69
- **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:
70
-
71
- ```ruby
72
- <% breadcrumb @category.title, blog_category_path(@category) %>
73
- ```
74
-
75
- Finally, in your view layout add semantic markup to show breadcrumbs:
86
+ Then in your view render the breadcrumbs trail using [breadcrumb_trail](#22-breadcrumb_trail)
76
87
 
77
- ```html
78
- <ul class='breadcrumbs'>
79
- <% breadcrumbs do |name, url, styles| %>
80
- <li class="<%= styles %>">
81
- <%= link_to name, url %>
82
- <span><%= styles == 'selected' ? '' : '::' %></span>
83
- </li>
84
- <% end %>
85
- </ul>
86
- ```
88
+ ## 2. API
87
89
 
88
- Usually best practice is to put such snippet inside its own partial.
89
-
90
- ### 1.1 breadcrumb
90
+ ### 2.1 breadcrumb
91
91
 
92
92
  Creation of breadcrumb in Rails is achieved by the `breadcrumb` helper.
93
93
 
@@ -117,7 +117,7 @@ You can specify segments of the url:
117
117
  breadcrumb @category.title, {controller: 'categories', action: 'show', id: @category.id}
118
118
  ```
119
119
 
120
- #### 1.1.1 breadcrumb in controller
120
+ #### 2.1.1 controller
121
121
 
122
122
  Breadcrumbs are inherited, so if you set a breadcrumb in `ApplicationController`, it will be inserted as a first element inside every breadcrumb trail. It is customary to set root breadcrumb like so:
123
123
 
@@ -127,7 +127,7 @@ class ApplicationController < ActionController::Base
127
127
  end
128
128
  ```
129
129
 
130
- In controller outside of any action the `breadcrumb` acts as filter.
130
+ Outside of controller actions the `breadcrumb` helper behaviour is similar to filters/actions and as such you can limit breadcrumb scope with familiar options `:only`, `:except`. Any breadcrumb specified inside actions creates another level in breadcrumbs trail.
131
131
 
132
132
  ```ruby
133
133
  class ArticlesController < ApplicationController
@@ -135,6 +135,20 @@ class ArticlesController < ApplicationController
135
135
  end
136
136
  ```
137
137
 
138
+ Each time you call the `breadcrumb` helper, a new element is added to a breadcrumb trial stack:
139
+
140
+ ```ruby
141
+ class ArticlesController < ApplicationController
142
+ breadcrumb 'Home', :root_path
143
+ breadcrumb 'All Articles', :articles_path
144
+
145
+ def show
146
+ breadcrumb 'Article One', article_path(:one)
147
+ breadcrumb 'Article Two', article_path(:two)
148
+ end
149
+ end
150
+ ```
151
+
138
152
  **Loaf** allows you to call controller instance methods inside the `breadcrumb` helper outside of any action. This is useful if your breadcrumb has parameterized behaviour. For example, to dynamically evaluate parameters for breadcrumb title do:
139
153
 
140
154
  ```ruby
@@ -151,42 +165,92 @@ class CommentsController < ApplicationController
151
165
  end
152
166
  ```
153
167
 
154
- ### 1.2 force
168
+ #### 2.1.2 view
155
169
 
156
- **Loaf** allows you to force a breadcrumb to be current.
170
+ **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:
157
171
 
158
- For example, on the create action as you are likely want the breadcrumb to be similar as for new action.
172
+ ```ruby
173
+ <% breadcrumb @category.title, blog_category_path(@category) %>
174
+ ```
175
+
176
+ #### 2.1.3 :match
177
+
178
+ **Loaf** allows you to define matching conditions in order to make a breadcrumb current with the `:match` option.
179
+
180
+ The `:match` key accepts the following values:
181
+
182
+ * `:inclusive` - the default value, which matches nested paths
183
+ * `:exact` - matches only the exact same path
184
+ * `:exclusive` - matches only direct path and its query params if present
185
+ * `/regex/` - matches based on regular expression
186
+ * `{foo: bar}` - match based on query params
187
+
188
+ For example, to force a breadcrumb to be the current regardless do:
159
189
 
160
190
  ```ruby
161
- class PostsController < ApplicationController
162
- def create
163
- breadcrumb 'New Post', new_post_path, force: true
164
- render action: :new
165
- end
191
+ breadcrumb 'New Post', new_post_path, match: :exact
192
+ ```
193
+
194
+ To make a breadcrumb current based on the query params do:
195
+
196
+ ```ruby
197
+ breadcrumb 'Posts', posts_path(order: :desc), match: {order: :desc}
198
+ ```
199
+
200
+ ### 2.2 breadcrumb_trail
201
+
202
+ In order to display breadcrumbs use the `breadcrumb_trail` view helper which as an argument accepts options and yeilds all breadcrumbs to a block:
203
+
204
+ ```ruby
205
+ breadcrumb_trail do |crumb|
206
+ ...
166
207
  end
167
208
  ```
168
209
 
169
- ## 2. Configuration
210
+ The yielded pararmeter is a `Loaf::Crumb` object that provides the following methods:
211
+
212
+ ```ruby
213
+ crumb.name # => the name as string
214
+ crumb.path # => the path as string
215
+ crumb.url # => alias for path
216
+ crumb.current? # => true or false
217
+ ```
218
+
219
+ For example, you can add the following semantic markup to show breadcrumbs using the `breadcrumb_trail` helper like so:
220
+
221
+ ```erb
222
+ <nav aria-label="Breadcrumb">
223
+ <ol class='breadcrumbs'>
224
+ <% breadcrumb_trail do |crumb| %>
225
+ <li class="<%= crumb.current? ? 'current' : '' %>">
226
+ <%= link_to crumb.name, crumb.url, (crumb.current? ? {'aria-current' => 'page'} : {}) %>
227
+ <% unless crumb.current? %><span>::</span><% end %>
228
+ </li>
229
+ <% end %>
230
+ </ol>
231
+ </nav>
232
+ ```
233
+
234
+ Usually best practice is to put such snippet inside its own partial.
235
+
236
+ ## 3. Configuration
170
237
 
171
238
  There is a small set of custom opinionated defaults. The following options are valid parameters:
172
239
 
173
240
  ```ruby
174
- :crumb_length # breadcrumb length in integer, default length is 30 characters
175
- :root # boolean, default is true, displays the home crumb
176
241
  :capitalize # set breadcrumbs to have initial letter uppercase, default false
177
- :style_classes # CSS class to be used to style current breadcrumb,
178
- # defaults to 'selected'
242
+ :crumb_length # breadcrumb length in integer, default length is 30 characters
179
243
  ```
180
244
 
181
245
  You can override them in your views by passing them to the view `breadcrumb` helper
182
246
 
183
- ```ruby
184
- <% breadcrumbs crumb_length: 20 do |name, url, styles| %>
247
+ ```erb
248
+ <% breadcrumb_trail crumb_length: 20 do |name, url, styles| %>
185
249
  ..
186
250
  <% end %>
187
251
  ```
188
252
 
189
- or by adding initializer in `config/initializers/loaf.rb`:
253
+ or by configuring an option in `config/initializers/loaf.rb`:
190
254
 
191
255
  ```ruby
192
256
  Loaf.configure do |config|
@@ -194,7 +258,7 @@ Loaf.configure do |config|
194
258
  end
195
259
  ```
196
260
 
197
- ## 3. Translation
261
+ ## 4. Translation
198
262
 
199
263
  You can use locales files for breadcrumbs' titles. **Loaf** assumes that all breadcrumb names are scoped inside `breadcrumbs` namespace inside `loaf` scope. However, this can be easily changed by passing `scope: 'new_scope_name'` configuration option.
200
264
 
@@ -225,8 +289,8 @@ en:
225
289
 
226
290
  ## Contributing
227
291
 
228
- Questions or problems? Please post them on the [issue tracker](https://github.com/peter-murach/loaf/issues). You can contribute changes by forking the project and submitting a pull request. You can ensure the tests are passing by running `bundle` and `rake`.
292
+ Questions or problems? Please post them on the [issue tracker](https://github.com/piotrmurach/loaf/issues). You can contribute changes by forking the project and submitting a pull request. You can ensure the tests are passing by running `bundle` and `rake`.
229
293
 
230
294
  ## Copyright
231
295
 
232
- Copyright (c) 2011-2015 Piotr Murach. See LICENSE.txt for further details.
296
+ Copyright (c) 2011-2017 Piotr Murach. See LICENSE.txt for further details.
Binary file
data/bin/appraisal ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'appraisal' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require "pathname"
10
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require "rubygems"
14
+ require "bundler/setup"
15
+
16
+ load Gem.bin_path("appraisal", "appraisal")
data/bin/rake ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rake' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require "pathname"
10
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require "rubygems"
14
+ require "bundler/setup"
15
+
16
+ load Gem.bin_path("rake", "rake")
@@ -2,21 +2,23 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "ammeter"
6
- gem "bundler", "~> 1.3"
7
- gem "appraisal", "~> 1.0.2"
8
- gem "rake", "~> 10.4.2"
9
- gem "yard", "~> 0.8.7"
10
- gem "sqlite3", "~> 1.3.10", :platforms => :ruby
11
- gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.10", :platforms => :jruby
12
- gem "capybara", "~> 2.4.4"
13
- gem "rspec-rails", "~> 3.1.0"
14
- gem "rails", "~> 3.2.21"
5
+ gem "ammeter", "~> 1.1.4"
6
+ gem "appraisal", "~> 2.2.0"
7
+ gem "yard", "~> 0.9.9"
8
+ gem "capybara", "~> 2.15.4"
9
+ gem "rspec-rails", "~> 3.6.1"
10
+ gem "nokogiri", "~> 1.6.8"
11
+ gem "public_suffix", "~> 2.0.5"
12
+ gem "sqlite3", "~> 1.3.13", platforms: :ruby
13
+ gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.23", platforms: :jruby
14
+ gem "rails", "~> 3.2.22.5"
15
+ gem "test-unit"
16
+ gem "mime-types", "~> 2.99"
15
17
 
16
18
  group :metrics do
17
- gem "coveralls", "~> 0.7.2"
18
- gem "simplecov", "~> 0.9.1"
19
+ gem "coveralls", "0.8.17"
20
+ gem "simplecov", "~> 0.12.0"
19
21
  gem "yardstick", "~> 0.9.9"
20
22
  end
21
23
 
22
- gemspec :path => "../"
24
+ gemspec path: "../"
@@ -2,22 +2,23 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "ammeter"
6
- gem "bundler", "~> 1.3"
7
- gem "appraisal", "~> 1.0.2"
8
- gem "rake", "~> 10.4.2"
9
- gem "yard", "~> 0.8.7"
10
- gem "sqlite3", "~> 1.3.10", :platforms => :ruby
11
- gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.10", :platforms => :jruby
12
- gem "capybara", "~> 2.4.4"
13
- gem "rspec-rails", "~> 3.1.0"
5
+ gem "ammeter", "~> 1.1.4"
6
+ gem "appraisal", "~> 2.2.0"
7
+ gem "yard", "~> 0.9.9"
8
+ gem "capybara", "~> 2.15.4"
9
+ gem "rspec-rails", "~> 3.6.1"
10
+ gem "nokogiri", "~> 1.6.8"
11
+ gem "public_suffix", "~> 2.0.5"
12
+ gem "sqlite3", "~> 1.3.13", platforms: :ruby
13
+ gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.23", platforms: :jruby
14
14
  gem "rails", "~> 4.0.13"
15
15
  gem "test-unit"
16
+ gem "mime-types", "~> 2.99"
16
17
 
17
18
  group :metrics do
18
- gem "coveralls", "~> 0.7.2"
19
- gem "simplecov", "~> 0.9.1"
19
+ gem "coveralls", "0.8.17"
20
+ gem "simplecov", "~> 0.12.0"
20
21
  gem "yardstick", "~> 0.9.9"
21
22
  end
22
23
 
23
- gemspec :path => "../"
24
+ gemspec path: "../"
@@ -2,21 +2,22 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "ammeter"
6
- gem "bundler", "~> 1.3"
7
- gem "appraisal", "~> 1.0.2"
8
- gem "rake", "~> 10.4.2"
9
- gem "yard", "~> 0.8.7"
10
- gem "sqlite3", "~> 1.3.10", :platforms => :ruby
11
- gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.10", :platforms => :jruby
12
- gem "capybara", "~> 2.4.4"
13
- gem "rspec-rails", "~> 3.1.0"
14
- gem "rails", "~> 4.1.9"
5
+ gem "ammeter", "~> 1.1.4"
6
+ gem "appraisal", "~> 2.2.0"
7
+ gem "yard", "~> 0.9.9"
8
+ gem "capybara", "~> 2.15.4"
9
+ gem "rspec-rails", "~> 3.6.1"
10
+ gem "nokogiri", "~> 1.6.8"
11
+ gem "public_suffix", "~> 2.0.5"
12
+ gem "sqlite3", "~> 1.3.13", platforms: :ruby
13
+ gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.23", platforms: :jruby
14
+ gem "rails", "~> 4.1.16"
15
+ gem "mime-types", "~> 2.99"
15
16
 
16
17
  group :metrics do
17
- gem "coveralls", "~> 0.7.2"
18
- gem "simplecov", "~> 0.9.1"
18
+ gem "coveralls", "0.8.17"
19
+ gem "simplecov", "~> 0.12.0"
19
20
  gem "yardstick", "~> 0.9.9"
20
21
  end
21
22
 
22
- gemspec :path => "../"
23
+ gemspec path: "../"
@@ -2,21 +2,22 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "ammeter"
6
- gem "bundler", "~> 1.3"
7
- gem "appraisal", "~> 1.0.2"
8
- gem "rake", "~> 10.4.2"
9
- gem "yard", "~> 0.8.7"
10
- gem "sqlite3", "~> 1.3.10", :platforms => :ruby
11
- gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.10", :platforms => :jruby
12
- gem "capybara", "~> 2.4.4"
13
- gem "rspec-rails", "~> 3.1.0"
14
- gem "rails", "~> 4.2.0"
5
+ gem "ammeter", "~> 1.1.4"
6
+ gem "appraisal", "~> 2.2.0"
7
+ gem "yard", "~> 0.9.9"
8
+ gem "capybara", "~> 2.15.4"
9
+ gem "rspec-rails", "~> 3.6.1"
10
+ gem "nokogiri", "~> 1.6.8"
11
+ gem "public_suffix", "~> 2.0.5"
12
+ gem "sqlite3", "~> 1.3.13", platforms: :ruby
13
+ gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.23", platforms: :jruby
14
+ gem "rails", "~> 4.2.9"
15
+ gem "mime-types", "~> 2.99"
15
16
 
16
17
  group :metrics do
17
- gem "coveralls", "~> 0.7.2"
18
- gem "simplecov", "~> 0.9.1"
18
+ gem "coveralls", "0.8.17"
19
+ gem "simplecov", "~> 0.12.0"
19
20
  gem "yardstick", "~> 0.9.9"
20
21
  end
21
22
 
22
- gemspec :path => "../"
23
+ gemspec path: "../"