loaf 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -3
- data/.rspec +1 -0
- data/.travis.yml +30 -12
- data/Appraisals +27 -9
- data/CHANGELOG.md +59 -11
- data/Gemfile +11 -11
- data/Gemfile.lock +182 -0
- data/README.md +120 -56
- data/assets/loaf_logo.png +0 -0
- data/bin/appraisal +16 -0
- data/bin/rake +16 -0
- data/gemfiles/rails3.2.gemfile +15 -13
- data/gemfiles/rails4.0.gemfile +13 -12
- data/gemfiles/rails4.1.gemfile +14 -13
- data/gemfiles/rails4.2.gemfile +14 -13
- data/gemfiles/rails5.0.gemfile +22 -0
- data/gemfiles/rails5.1.gemfile +22 -0
- data/lib/loaf.rb +2 -22
- data/lib/loaf/breadcrumb.rb +30 -0
- data/lib/loaf/configuration.rb +7 -8
- data/lib/loaf/controller_extensions.rb +13 -28
- data/lib/loaf/crumb.rb +5 -4
- data/lib/loaf/crumb_formatter.rb +3 -1
- data/lib/loaf/errors.rb +1 -3
- data/lib/loaf/options_validator.rb +2 -2
- data/lib/loaf/railtie.rb +19 -13
- data/lib/loaf/translation.rb +1 -1
- data/lib/loaf/version.rb +1 -3
- data/lib/loaf/view_extensions.rb +69 -18
- data/loaf.gemspec +20 -13
- data/spec/integration/{crumbs_routing_spec.rb → breadcrumb_trail_spec.rb} +19 -12
- data/spec/rails_app/app/controllers/application_controller.rb +2 -0
- data/spec/rails_app/app/controllers/posts_controller.rb +1 -4
- data/spec/rails_app/app/views/layouts/_breadcrumbs.html.erb +7 -5
- data/spec/rails_app/app/views/layouts/application.html.erb +0 -2
- data/spec/rails_app/config/environments/test.rb +1 -1
- data/spec/rails_app/config/secrets.yml +22 -0
- data/spec/spec_helper.rb +3 -3
- data/spec/support/dummy_controller.rb +9 -0
- data/spec/support/dummy_view.rb +42 -2
- data/spec/unit/configuration_spec.rb +35 -0
- data/spec/unit/controller_extensions_spec.rb +5 -14
- data/spec/unit/generators/install_generator_spec.rb +2 -1
- data/spec/unit/view_extensions/breadcrumb_trail_spec.rb +232 -0
- metadata +65 -31
- data/.ruby-version +0 -1
- data/init.rb +0 -3
- data/lib/loaf/builder.rb +0 -38
- data/spec/rails_app/.gitignore +0 -5
- data/spec/rails_app/lib/assets/.gitkeep +0 -0
- data/spec/rails_app/lib/tasks/.gitkeep +0 -0
- data/spec/rails_app/script/rails +0 -6
- 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
|
-
|
3
|
-
[][gem]
|
8
|
+
[][travis]
|
9
|
+
[][codeclimate]
|
10
|
+
[][gemnasium]
|
11
|
+
[][coveralls]
|
12
|
+
[][inchpages]
|
8
13
|
|
9
14
|
[gem]: http://badge.fury.io/rb/loaf
|
10
|
-
[travis]: http://travis-ci.org/
|
11
|
-
[codeclimate]: https://codeclimate.com/github/
|
12
|
-
[gemnasium]: https://gemnasium.com/
|
13
|
-
[coveralls]: https://coveralls.io/
|
14
|
-
[inchpages]: http://inch-ci.org/github/
|
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
|
-
*
|
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
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
####
|
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
|
-
|
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
|
-
|
168
|
+
#### 2.1.2 view
|
155
169
|
|
156
|
-
**Loaf**
|
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
|
-
|
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
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
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
|
-
|
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
|
-
:
|
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
|
-
```
|
184
|
-
<%
|
247
|
+
```erb
|
248
|
+
<% breadcrumb_trail crumb_length: 20 do |name, url, styles| %>
|
185
249
|
..
|
186
250
|
<% end %>
|
187
251
|
```
|
188
252
|
|
189
|
-
or by
|
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
|
-
##
|
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/
|
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-
|
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")
|
data/gemfiles/rails3.2.gemfile
CHANGED
@@ -2,21 +2,23 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "ammeter"
|
6
|
-
gem "
|
7
|
-
gem "
|
8
|
-
gem "
|
9
|
-
gem "
|
10
|
-
gem "
|
11
|
-
gem "
|
12
|
-
gem "
|
13
|
-
gem "
|
14
|
-
gem "rails", "~> 3.2.
|
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", "
|
18
|
-
gem "simplecov", "~> 0.
|
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 :
|
24
|
+
gemspec path: "../"
|
data/gemfiles/rails4.0.gemfile
CHANGED
@@ -2,22 +2,23 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "ammeter"
|
6
|
-
gem "
|
7
|
-
gem "
|
8
|
-
gem "
|
9
|
-
gem "
|
10
|
-
gem "
|
11
|
-
gem "
|
12
|
-
gem "
|
13
|
-
gem "
|
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", "
|
19
|
-
gem "simplecov", "~> 0.
|
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 :
|
24
|
+
gemspec path: "../"
|
data/gemfiles/rails4.1.gemfile
CHANGED
@@ -2,21 +2,22 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "ammeter"
|
6
|
-
gem "
|
7
|
-
gem "
|
8
|
-
gem "
|
9
|
-
gem "
|
10
|
-
gem "
|
11
|
-
gem "
|
12
|
-
gem "
|
13
|
-
gem "
|
14
|
-
gem "rails", "~> 4.1.
|
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", "
|
18
|
-
gem "simplecov", "~> 0.
|
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 :
|
23
|
+
gemspec path: "../"
|
data/gemfiles/rails4.2.gemfile
CHANGED
@@ -2,21 +2,22 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "ammeter"
|
6
|
-
gem "
|
7
|
-
gem "
|
8
|
-
gem "
|
9
|
-
gem "
|
10
|
-
gem "
|
11
|
-
gem "
|
12
|
-
gem "
|
13
|
-
gem "
|
14
|
-
gem "rails", "~> 4.2.
|
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", "
|
18
|
-
gem "simplecov", "~> 0.
|
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 :
|
23
|
+
gemspec path: "../"
|