emeril 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.cane +0 -0
- data/.gitignore +17 -0
- data/.tailor +106 -0
- data/.travis.yml +11 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +3 -0
- data/Guardfile +10 -0
- data/LICENSE.txt +22 -0
- data/README.md +261 -0
- data/Rakefile +33 -0
- data/emeril.gemspec +39 -0
- data/lib/emeril.rb +11 -0
- data/lib/emeril/category.rb +26 -0
- data/lib/emeril/git_tagger.rb +122 -0
- data/lib/emeril/logging.rb +17 -0
- data/lib/emeril/metadata_chopper.rb +38 -0
- data/lib/emeril/publisher.rb +130 -0
- data/lib/emeril/rake.rb +5 -0
- data/lib/emeril/rake_tasks.rb +41 -0
- data/lib/emeril/releaser.rb +80 -0
- data/lib/emeril/thor.rb +5 -0
- data/lib/emeril/thor_tasks.rb +45 -0
- data/lib/emeril/version.rb +6 -0
- data/spec/emeril/category_spec.rb +28 -0
- data/spec/emeril/git_tagger_spec.rb +147 -0
- data/spec/emeril/metadata_chopper_spec.rb +70 -0
- data/spec/emeril/publisher_spec.rb +223 -0
- data/spec/emeril/releaser_spec.rb +141 -0
- data/spec/fixtures/vcr_cassettes/known_cookbook.yml +46 -0
- data/spec/fixtures/vcr_cassettes/nonexistant_cookbook.yml +38 -0
- data/spec/spec_helper.rb +27 -0
- metadata +312 -0
data/.cane
ADDED
File without changes
|
data/.gitignore
ADDED
data/.tailor
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# Horizontal Whitespace
|
3
|
+
#------------------------------------------------------------------------------
|
4
|
+
# allow_hard_tabs True to let hard tabs be considered a single space.
|
5
|
+
# Default: false
|
6
|
+
#
|
7
|
+
# allow_trailing_line_spaces
|
8
|
+
# True to skip detecting extra spaces at the ends of
|
9
|
+
# lines.
|
10
|
+
# Default: false
|
11
|
+
#
|
12
|
+
# indentation_spaces The number of spaces to consider a proper indent.
|
13
|
+
# Default: 2
|
14
|
+
#
|
15
|
+
# max_line_length The maximum number of characters in a line before
|
16
|
+
# tailor complains.
|
17
|
+
# Default: 80
|
18
|
+
# spaces_after_comma Number of spaces to expect after a comma.
|
19
|
+
# Default: 1
|
20
|
+
#
|
21
|
+
# spaces_before_comma Number of spaces to expect before a comma.
|
22
|
+
# Default: 0
|
23
|
+
#
|
24
|
+
# spaces_after_lbrace The number of spaces to expect after an lbrace ('{').
|
25
|
+
# Default: 1
|
26
|
+
#
|
27
|
+
# spaces_before_lbrace The number of spaces to expect before an lbrace ('{').
|
28
|
+
# Default: 1
|
29
|
+
#
|
30
|
+
# spaces_before_rbrace The number of spaces to expect before an rbrace ('}').
|
31
|
+
# Default: 1
|
32
|
+
#
|
33
|
+
# spaces_in_empty_braces The number of spaces to expect between braces when
|
34
|
+
# there's nothing in the braces (i.e. {}).
|
35
|
+
# Default: 0
|
36
|
+
#
|
37
|
+
# spaces_after_lbracket The number of spaces to expect after an
|
38
|
+
# lbracket ('[').
|
39
|
+
# Default: 0
|
40
|
+
#
|
41
|
+
# spaces_before_rbracket The number of spaces to expect before an
|
42
|
+
# rbracket (']').
|
43
|
+
# Default: 0
|
44
|
+
#
|
45
|
+
# spaces_after_lparen The number of spaces to expect after an
|
46
|
+
# lparen ('(').
|
47
|
+
# Default: 0
|
48
|
+
#
|
49
|
+
# spaces_before_rparen The number of spaces to expect before an
|
50
|
+
# rbracket (')').
|
51
|
+
# Default: 0
|
52
|
+
#
|
53
|
+
#------------------------------------------------------------------------------
|
54
|
+
# Naming
|
55
|
+
#------------------------------------------------------------------------------
|
56
|
+
# allow_camel_case_methods
|
57
|
+
# Setting to true skips detection of camel-case method
|
58
|
+
# names (i.e. def myMethod).
|
59
|
+
# Default: false
|
60
|
+
#
|
61
|
+
# allow_screaming_snake_case_classes
|
62
|
+
# Setting to true skips detection of screaming
|
63
|
+
# snake-case class names (i.e. My_Class).
|
64
|
+
# Default: false
|
65
|
+
#
|
66
|
+
#------------------------------------------------------------------------------
|
67
|
+
# Vertical Whitespace
|
68
|
+
#------------------------------------------------------------------------------
|
69
|
+
# max_code_lines_in_class The number of lines of code in a class to allow before
|
70
|
+
# tailor will warn you.
|
71
|
+
# Default: 300
|
72
|
+
#
|
73
|
+
# max_code_lines_in_method
|
74
|
+
# The number of lines of code in a method to allow
|
75
|
+
# before tailor will warn you.
|
76
|
+
# Default: 30
|
77
|
+
#
|
78
|
+
# trailing_newlines The number of newlines that should be at the end of
|
79
|
+
# the file.
|
80
|
+
# Default: 1
|
81
|
+
#
|
82
|
+
Tailor.config do |config|
|
83
|
+
config.formatters "text"
|
84
|
+
config.file_set 'lib/**/*.rb' do |style|
|
85
|
+
style.allow_camel_case_methods false, level: :error
|
86
|
+
style.allow_hard_tabs false, level: :error
|
87
|
+
style.allow_screaming_snake_case_classes false, level: :error
|
88
|
+
style.allow_trailing_line_spaces false, level: :error
|
89
|
+
style.allow_invalid_ruby false, level: :warn
|
90
|
+
style.indentation_spaces 2, level: :error
|
91
|
+
style.max_code_lines_in_class 300, level: :error
|
92
|
+
style.max_code_lines_in_method 30, level: :error
|
93
|
+
style.max_line_length 80, level: :error
|
94
|
+
style.spaces_after_comma 1, level: :error
|
95
|
+
style.spaces_after_lbrace 1, level: :error
|
96
|
+
style.spaces_after_lbracket 0, level: :error
|
97
|
+
style.spaces_after_lparen 0, level: :error
|
98
|
+
style.spaces_before_comma 0, level: :error
|
99
|
+
style.spaces_before_lbrace 1, level: :error
|
100
|
+
style.spaces_before_rbrace 1, level: :error
|
101
|
+
style.spaces_before_rbracket 0, level: :error
|
102
|
+
style.spaces_before_rparen 0, level: :error
|
103
|
+
style.spaces_in_empty_braces 0, level: :error
|
104
|
+
style.trailing_newlines 1, level: :error
|
105
|
+
end
|
106
|
+
end
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Fletcher Nichol
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
# <a name="title"></a> Emeril: Tag And Release Chef Cookbooks As A Library
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/fnichol/emeril.png?branch=master)](https://travis-ci.org/fnichol/emeril)
|
4
|
+
[![Dependency Status](https://gemnasium.com/fnichol/emeril.png)](https://gemnasium.com/fnichol/emeril)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/fnichol/emeril.png)](https://codeclimate.com/github/fnichol/emeril)
|
6
|
+
|
7
|
+
Kick it up a notch! Emeril is a library that helps you release your Chef
|
8
|
+
cookbooks from Rake, Thor, or a Ruby library. If `rake release` is all you
|
9
|
+
are after, this should fit the bill.
|
10
|
+
|
11
|
+
## <a name="tl-dr"></a> tl;dr
|
12
|
+
|
13
|
+
How do you get started? Without much fanfare…
|
14
|
+
|
15
|
+
```sh
|
16
|
+
echo "gem 'emeril'" > Gemfile
|
17
|
+
bundle install
|
18
|
+
echo "require 'emeril/rake'" > Rakefile
|
19
|
+
bundle exec rake release
|
20
|
+
```
|
21
|
+
|
22
|
+
**Bam!**
|
23
|
+
|
24
|
+
Need more details? Read on…
|
25
|
+
|
26
|
+
## <a name="how-it-works"></a> How It Works
|
27
|
+
|
28
|
+
Emeril has 2 primary tasks and goals:
|
29
|
+
|
30
|
+
1. Tag a Git commit with a semantic version tag with the form `"v1.2.5"` (by
|
31
|
+
default)
|
32
|
+
2. Publish a versioned release of the cookbook to the
|
33
|
+
[Community Site][community_site]
|
34
|
+
|
35
|
+
The Git tagging is currently accomplished via shell out, so Git must be
|
36
|
+
installed on your system.
|
37
|
+
|
38
|
+
In order to bypass the deeply coupled `cookbook_path` assumptions that exist
|
39
|
+
in the Knife plugins, the publishing task (implemented by the
|
40
|
+
[Publisher class][publisher_class]) will create a temporary sandboxed copy
|
41
|
+
of the primary cookbook files for use by the
|
42
|
+
[CookbookSiteShare][knife_plugin] Knife plugin. The following files are
|
43
|
+
considered production cookbook files:
|
44
|
+
|
45
|
+
* `README.*`
|
46
|
+
* `CHANGELOG.*`
|
47
|
+
* `metadata.{json,rb}`
|
48
|
+
* `attributes/**/*`
|
49
|
+
* `files/**/*`
|
50
|
+
* `libraries/**/*`
|
51
|
+
* `providers/**/*`
|
52
|
+
* `recipes/**/*`
|
53
|
+
* `resources/**/*`
|
54
|
+
* `templates/**/*`
|
55
|
+
|
56
|
+
If the above list seems incomplete or incorrect, please submit an
|
57
|
+
[issue][issues].
|
58
|
+
|
59
|
+
## <a name="installation"></a> Installation
|
60
|
+
|
61
|
+
Add this line to your application's Gemfile:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
gem 'emeril'
|
65
|
+
```
|
66
|
+
|
67
|
+
And then execute:
|
68
|
+
|
69
|
+
```sh
|
70
|
+
bundle
|
71
|
+
```
|
72
|
+
|
73
|
+
Or install it yourself as:
|
74
|
+
|
75
|
+
```sh
|
76
|
+
gem install emeril
|
77
|
+
```
|
78
|
+
|
79
|
+
## <a name="usage"></a> Usage
|
80
|
+
|
81
|
+
### <a name="usage-setup"></a> Credentials Setup
|
82
|
+
|
83
|
+
Emeril currently uses the [CookbookSiteShare][knife_plugin] to do most of the
|
84
|
+
heavy lifting, so you will need a minimally configured [knife.rb][knife_rb]
|
85
|
+
file with some required attributes set.
|
86
|
+
|
87
|
+
There are 2 configuration items you need:
|
88
|
+
|
89
|
+
1. Your [Community Site][community_site] username, chosen at signup time.
|
90
|
+
2. The file path to your [Community Site][community_site] user certificate.
|
91
|
+
When you sign up to the Community Site, the site will provide this key to
|
92
|
+
you as a `*.pem` file.
|
93
|
+
|
94
|
+
The easiest way to get setup is to add both of these items to your default
|
95
|
+
`knife.rb` file located at `$HOME/.chef/knife.rb`. If you are setting this
|
96
|
+
file up for the first time, give this a go (substituting your username, and
|
97
|
+
key location):
|
98
|
+
|
99
|
+
```sh
|
100
|
+
mkdir -p $HOME/.chef
|
101
|
+
cat <<KNIFE_RB > $HOME/.chef/knife.rb
|
102
|
+
node_name "fnichol"
|
103
|
+
client_key File.expand_path('~/.chef/fnichol.pem')
|
104
|
+
KNIFE_RB
|
105
|
+
```
|
106
|
+
|
107
|
+
### <a name="usage-rake"></a> Rake Tasks
|
108
|
+
|
109
|
+
To add the default Rake task (`rake release`), add the following to your
|
110
|
+
`Rakefile`:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
require 'emeril/rake'
|
114
|
+
```
|
115
|
+
|
116
|
+
If you need to further customize the `Emeril::Releaser` object you can use
|
117
|
+
the more explicit format with a block:
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
require 'emeril/rake_tasks'
|
121
|
+
|
122
|
+
Emeril::RakeTasks.new do |t|
|
123
|
+
# turn on debug logging
|
124
|
+
t.config[:logger].level = :debug
|
125
|
+
|
126
|
+
# disable git tag prefix string
|
127
|
+
t.config[:tag_prefix] = false
|
128
|
+
|
129
|
+
# set a category for this cookbook
|
130
|
+
t.config[:category] = "Applications"
|
131
|
+
end
|
132
|
+
```
|
133
|
+
|
134
|
+
### <a name="usage-rake"></a> Thor Tasks
|
135
|
+
|
136
|
+
To add the default Thor task (`thor emeril:release`), add the following to your
|
137
|
+
`Thorfile`:
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
require 'emeril/thor'
|
141
|
+
```
|
142
|
+
|
143
|
+
If you need to further customize the `Emeril::Releaser` object you can use
|
144
|
+
the more explicit format with a block:
|
145
|
+
|
146
|
+
```ruby
|
147
|
+
require 'emeril/thor_tasks'
|
148
|
+
|
149
|
+
Emeril::ThorTasks.new do |t|
|
150
|
+
# turn on debug logging
|
151
|
+
t.config[:logger].level = :debug
|
152
|
+
|
153
|
+
# disable git tag prefix string
|
154
|
+
t.config[:tag_prefix] = false
|
155
|
+
|
156
|
+
# set a category for this cookbook
|
157
|
+
t.config[:category] = "Applications"
|
158
|
+
end
|
159
|
+
```
|
160
|
+
|
161
|
+
### <a name="usage-ruby"></a> Ruby Library
|
162
|
+
|
163
|
+
The Ruby API is fairly straight forward, but keep in mind that loading or
|
164
|
+
populating `Chef::Config[:node_name]` and `Chef::Config[:client_key]` is
|
165
|
+
the responsibility of the caller, not Emeril.
|
166
|
+
|
167
|
+
For example, to load configuration from [knife.rb][knife_rb] and invoke the
|
168
|
+
same code as the default Rake and Thor tasks, use the following:
|
169
|
+
|
170
|
+
```ruby
|
171
|
+
# Populate Chef::Config from knife.rb
|
172
|
+
require 'chef/knife'
|
173
|
+
Chef::Knife.new.configure_chef
|
174
|
+
|
175
|
+
# Perform the git tagging and share to the Community Site
|
176
|
+
require 'emeril'
|
177
|
+
Emeril::Releaser.new(logger: Chef::Log).run
|
178
|
+
```
|
179
|
+
|
180
|
+
## <a name="faq"></a> Frequently Asked Questions
|
181
|
+
|
182
|
+
* **"Why doesn't Emeril automatically bump version numbers?"**
|
183
|
+
Emeril assumes that you are using a [Semantic Versioning][semver_site] scheme
|
184
|
+
for your cookbooks. Consequently it is very hard to determine what the
|
185
|
+
next version number should be when this number is coupled to the changes
|
186
|
+
accompanying the release. The next release could contain a bug fix, a new
|
187
|
+
feature, or contain a backwards incompatible change--all of which have a
|
188
|
+
bearing on the version number.
|
189
|
+
* **"Okay, what if I supplied the version number, couldn't Emeril help me
|
190
|
+
then?"** Perhaps, but don't forget the other essential release artifact:
|
191
|
+
a project [changelog][changelog_wikipedia]. While the maintenance schedule
|
192
|
+
of the changelog is up to each author, it is sometimes desirable to
|
193
|
+
combine the version bump and changelog items in [one][ex1] [git][ex2]
|
194
|
+
[commit][ex3]. Emeril will tag and release your cookbook based on the
|
195
|
+
last Git commit which is presumably your *version-bump-and-changelog*
|
196
|
+
commit.
|
197
|
+
* **"How do I change the category for my cookbook?"** Emeril will maintain
|
198
|
+
the category used on the Community Site across releases. By default, new
|
199
|
+
cookbooks will be put in the `"Other"` category. For now you can change
|
200
|
+
the category directly on the Community Site, done! Otherwise, check out
|
201
|
+
the [Rake](#usage-rake) and [Thor](#usage-thor) sections for further
|
202
|
+
configuration help.
|
203
|
+
* **"Why is Emeril complaining that I'm missing the name attribute in my
|
204
|
+
metadata.rb?"** You want to set this name attribute. It unambiguously sets
|
205
|
+
the name of the cookbook and not the directory name that happens to contain
|
206
|
+
the cookbook code. Modern tools such as [Berkshelf][berkshelf_site] require
|
207
|
+
this for dependency resolution and the [Foodcritic][foodcritic_site]
|
208
|
+
cookbook linting tool has rule [FC045][fc045] to help catch this omission.
|
209
|
+
|
210
|
+
## <a name="alternatives"></a> Alternatives
|
211
|
+
|
212
|
+
* [knife-community][knife_community] - a more complete, workflow-enabled tool
|
213
|
+
by [Mike Fiedler](https://github.com/miketheman).
|
214
|
+
* [knife community site share][knife_share] - with some extra/manual git
|
215
|
+
tagging, correct directory structure, and workflow. Ships with the
|
216
|
+
[Chef gem][chef_gem].
|
217
|
+
|
218
|
+
## <a name="development"></a> Development
|
219
|
+
|
220
|
+
* Source hosted at [GitHub][repo]
|
221
|
+
* Report issues/questions/feature requests on [GitHub Issues][issues]
|
222
|
+
|
223
|
+
Pull requests are very welcome! Make sure your patches are well tested.
|
224
|
+
Ideally create a topic branch for every separate change you make. For
|
225
|
+
example:
|
226
|
+
|
227
|
+
1. Fork the repo
|
228
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
229
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
230
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
231
|
+
5. Create new Pull Request
|
232
|
+
|
233
|
+
## <a name="authors"></a> Authors
|
234
|
+
|
235
|
+
Created and maintained by [Fletcher Nichol][fnichol] (<fnichol@nichol.ca>)
|
236
|
+
|
237
|
+
## <a name="license"></a> License
|
238
|
+
|
239
|
+
MIT (see [LICENSE.txt][license])
|
240
|
+
|
241
|
+
[license]: https://github.com/fnichol/emeril/blob/master/LICENSE.txt
|
242
|
+
[fnichol]: https://github.com/fnichol
|
243
|
+
[repo]: https://github.com/fnichol/emeril
|
244
|
+
[issues]: https://github.com/fnichol/emeril/issues
|
245
|
+
[contributors]: https://github.com/fnichol/emeril/contributors
|
246
|
+
|
247
|
+
[berkshelf_site]: http://berkshelf.com/
|
248
|
+
[changelog_wikipedia]: http://en.wikipedia.org/wiki/Changelog
|
249
|
+
[chef_gem]: https://github.com/opscode/chef
|
250
|
+
[community_site]: http://community.opscode.com/
|
251
|
+
[ex1]: https://github.com/fnichol/chef-ruby_build/commit/c940b5e9cd40eaba10d6285de6648f4d25fe959d
|
252
|
+
[ex2]: https://github.com/fnichol/chef-homesick/commit/80e558ff921f1c59698f6942214c0224a24392d7
|
253
|
+
[ex3]: https://github.com/fnichol/chef-openoffice/commit/bf84aba0690a6b155b499b06df953be19a3aead1
|
254
|
+
[fc045]: http://acrmp.github.io/foodcritic/#FC045
|
255
|
+
[foodcritic_site]: http://acrmp.github.io/foodcritic/
|
256
|
+
[knife_plugin]: https://github.com/opscode/chef/blob/master/lib/chef/knife/cookbook_site_share.rb
|
257
|
+
[knife_rb]: http://docs.opscode.com/config_rb_knife.html
|
258
|
+
[knife_community]: http://miketheman.github.io/knife-community/
|
259
|
+
[knife_share]: http://docs.opscode.com/knife_cookbook_site.html#share
|
260
|
+
[publisher_class]: https://github.com/fnichol/emeril/blob/master/lib/emeril/publisher.rb
|
261
|
+
[semver_site]: http://semver.org/
|