aws-ec2 0.9.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.gitmodules +0 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +18 -10
- data/LICENSE.txt +1 -1
- data/README.md +74 -7
- data/Rakefile +1 -1
- data/aws-ec2.gemspec +7 -5
- data/lib/aws-ec2.rb +5 -2
- data/lib/aws_ec2/ami.rb +1 -1
- data/lib/aws_ec2/base.rb +34 -1
- data/lib/aws_ec2/cli.rb +20 -1
- data/lib/aws_ec2/command.rb +34 -5
- data/lib/aws_ec2/completer.rb +161 -0
- data/lib/aws_ec2/completer/script.rb +6 -0
- data/lib/aws_ec2/completer/script.sh +10 -0
- data/lib/aws_ec2/config.rb +4 -2
- data/lib/aws_ec2/core.rb +5 -1
- data/lib/aws_ec2/create.rb +11 -8
- data/lib/aws_ec2/create/error_messages.rb +1 -1
- data/lib/aws_ec2/create/params.rb +2 -6
- data/lib/aws_ec2/help/completion.md +22 -0
- data/lib/aws_ec2/help/completion_script.md +3 -0
- data/lib/aws_ec2/profile.rb +26 -19
- data/lib/aws_ec2/script.rb +1 -0
- data/lib/aws_ec2/script/compile.rb +15 -6
- data/lib/aws_ec2/script/compress.rb +62 -0
- data/lib/aws_ec2/script/upload.rb +75 -9
- data/lib/aws_ec2/setting.rb +41 -0
- data/lib/aws_ec2/template.rb +13 -0
- data/lib/aws_ec2/template/context.rb +32 -0
- data/lib/aws_ec2/template/helper.rb +17 -0
- data/lib/aws_ec2/{template_helper → template/helper}/ami_helper.rb +8 -3
- data/lib/aws_ec2/template/helper/core_helper.rb +88 -0
- data/lib/aws_ec2/{template_helper → template/helper}/partial_helper.rb +2 -2
- data/lib/aws_ec2/template/helper/script_helper.rb +53 -0
- data/lib/aws_ec2/template/helper/ssh_key_helper.rb +21 -0
- data/lib/aws_ec2/version.rb +1 -1
- data/spec/lib/cli_spec.rb +14 -0
- data/spec/spec_helper.rb +16 -6
- metadata +54 -14
- data/lib/aws_ec2/template_helper.rb +0 -18
- data/lib/aws_ec2/template_helper/core_helper.rb +0 -98
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41c5379df446fa7ebaeb8a4e7243b70c6b8ef3c91afc6a61af1ab42181695c8a
|
4
|
+
data.tar.gz: 8d4558040a99f9496bfdf74b1d43aeb470229f370ae9b14cda174a4096e83f34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ce576737f3e0dc3c225c581d1507e9a9d338e048db588f7776cd2faa45e73d580b1789e43103d5e9d61298016457c4ec011e3eddf387eb14573fea292550d78
|
7
|
+
data.tar.gz: 94969a46aeb9d0e203b141dc7114df127b1bf353405c2d0574996493baaeea4d79c2863773e895d2d47b4228968c0876e94cba8e0606d628a69d893fac045524
|
data/.gitignore
CHANGED
data/.gitmodules
ADDED
File without changes
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,17 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [1.0.0]
|
7
|
+
- Merge pull request #1 from tongueroo/cli-template-upgrade
|
8
|
+
- Merge pull request #2 from tongueroo/render_me_pretty
|
9
|
+
- Merge pull request #3 from tongueroo/s3-upload
|
10
|
+
- Merge pull request #4 from tongueroo/layout-support
|
11
|
+
- add --randomize option
|
12
|
+
- add extract_scripts and add_ssh_key helpers
|
13
|
+
- conventionally use name of server as profile if profile exists
|
14
|
+
- introduce settings.yml
|
15
|
+
- latest_ami: exit if image cannot be found
|
16
|
+
|
6
17
|
## [0.9.0]
|
7
18
|
- much improved error messaging
|
8
19
|
- rename docs folder
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,32 +1,34 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
aws-ec2 (0.
|
4
|
+
aws-ec2 (0.9.0)
|
5
5
|
activesupport
|
6
6
|
aws-sdk-ec2
|
7
7
|
colorize
|
8
8
|
dotenv
|
9
|
+
filesize
|
9
10
|
hashie
|
11
|
+
render_me_pretty
|
10
12
|
thor
|
11
13
|
|
12
14
|
GEM
|
13
15
|
remote: https://rubygems.org/
|
14
16
|
specs:
|
15
|
-
activesupport (5.1.
|
17
|
+
activesupport (5.1.5)
|
16
18
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
19
|
i18n (~> 0.7)
|
18
20
|
minitest (~> 5.1)
|
19
21
|
tzinfo (~> 1.1)
|
20
|
-
aws-partitions (1.
|
21
|
-
aws-sdk-core (3.
|
22
|
+
aws-partitions (1.67.0)
|
23
|
+
aws-sdk-core (3.17.0)
|
22
24
|
aws-partitions (~> 1.0)
|
23
25
|
aws-sigv4 (~> 1.0)
|
24
26
|
jmespath (~> 1.0)
|
25
|
-
aws-sdk-ec2 (1.
|
27
|
+
aws-sdk-ec2 (1.28.0)
|
26
28
|
aws-sdk-core (~> 3)
|
27
29
|
aws-sigv4 (~> 1.0)
|
28
30
|
aws-sigv4 (1.0.2)
|
29
|
-
byebug (
|
31
|
+
byebug (10.0.0)
|
30
32
|
codeclimate-test-reporter (1.0.8)
|
31
33
|
simplecov (<= 0.13)
|
32
34
|
coderay (1.1.2)
|
@@ -35,7 +37,8 @@ GEM
|
|
35
37
|
diff-lcs (1.3)
|
36
38
|
docile (1.1.5)
|
37
39
|
dotenv (2.2.1)
|
38
|
-
ffi (1.9.
|
40
|
+
ffi (1.9.23)
|
41
|
+
filesize (0.1.1)
|
39
42
|
formatador (0.2.5)
|
40
43
|
guard (2.14.2)
|
41
44
|
formatador (>= 0.2.4)
|
@@ -56,7 +59,7 @@ GEM
|
|
56
59
|
guard-compat (~> 1.1)
|
57
60
|
rspec (>= 2.99.0, < 4.0)
|
58
61
|
hashie (3.5.7)
|
59
|
-
i18n (0.9.
|
62
|
+
i18n (0.9.5)
|
60
63
|
concurrent-ruby (~> 1.0)
|
61
64
|
jmespath (1.3.1)
|
62
65
|
json (2.1.0)
|
@@ -78,6 +81,10 @@ GEM
|
|
78
81
|
rb-fsevent (0.10.2)
|
79
82
|
rb-inotify (0.9.10)
|
80
83
|
ffi (>= 0.5.0, < 2)
|
84
|
+
render_me_pretty (0.8.0)
|
85
|
+
activesupport
|
86
|
+
colorize
|
87
|
+
tilt
|
81
88
|
rspec (3.7.0)
|
82
89
|
rspec-core (~> 3.7.0)
|
83
90
|
rspec-expectations (~> 3.7.0)
|
@@ -90,7 +97,7 @@ GEM
|
|
90
97
|
rspec-mocks (3.7.0)
|
91
98
|
diff-lcs (>= 1.2.0, < 2.0)
|
92
99
|
rspec-support (~> 3.7.0)
|
93
|
-
rspec-support (3.7.
|
100
|
+
rspec-support (3.7.1)
|
94
101
|
ruby_dep (1.5.0)
|
95
102
|
shellany (0.0.1)
|
96
103
|
simplecov (0.13.0)
|
@@ -100,7 +107,8 @@ GEM
|
|
100
107
|
simplecov-html (0.10.2)
|
101
108
|
thor (0.20.0)
|
102
109
|
thread_safe (0.3.6)
|
103
|
-
|
110
|
+
tilt (2.0.8)
|
111
|
+
tzinfo (1.2.5)
|
104
112
|
thread_safe (~> 0.1)
|
105
113
|
|
106
114
|
PLATFORMS
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# AWS EC2 Tool
|
2
2
|
|
3
|
-
|
3
|
+
[![CircleCI](https://circleci.com/gh/tongueroo/aws-ec2.svg?style=svg)](https://circleci.com/gh/tongueroo/aws-ec2)
|
4
|
+
|
5
|
+
Tool to create AWS ec2 instances consistently with pre-configured settings. The pre-configured settings are stored in the profiles folder of the current project directory.
|
4
6
|
Example:
|
5
7
|
|
6
8
|
* profiles/default.yml: Default settings. Used when no profile is specified.
|
@@ -9,6 +11,7 @@ Example:
|
|
9
11
|
## Usage
|
10
12
|
|
11
13
|
```sh
|
14
|
+
aws-ec2 create NAME --profile PROFILE
|
12
15
|
aws-ec2 create myserver --profile myserver
|
13
16
|
```
|
14
17
|
|
@@ -23,17 +26,40 @@ aws-ec2 create myserver --profile myserver --noop
|
|
23
26
|
cat tmp/user-data.txt # to view generated user-data script
|
24
27
|
```
|
25
28
|
|
29
|
+
## Conventional Profile Name
|
30
|
+
|
31
|
+
If there is a profile name that matches the ec2 specified instance name, you can omit the `--profile` flag. Example
|
32
|
+
|
33
|
+
```sh
|
34
|
+
aws-ec2 create webserver --profile webserver
|
35
|
+
aws-ec2 create webserver # same thing as --profile whatever
|
36
|
+
```
|
37
|
+
|
38
|
+
It is useful to add a random string to the end of your server name, but not use it for the `--profile` flag. Example:
|
39
|
+
|
40
|
+
```
|
41
|
+
aws-ec2 create myserver-abc --profile myserver
|
42
|
+
aws-ec2 create myserver-123 --profile myserver
|
43
|
+
```
|
44
|
+
|
45
|
+
You can use the `--randomize` option to do this automatically:
|
46
|
+
|
47
|
+
```
|
48
|
+
aws-ec2 create myserver --randomize
|
49
|
+
```
|
50
|
+
|
26
51
|
## Project Structure
|
27
52
|
|
28
53
|
Directory | Description
|
29
54
|
------------- | -------------
|
30
55
|
app/helpers | Custom helpers methods. Define them as modules and their methods are made available whenever ERB is available: `profiles`, `app/scripts`, `app/user-data` files, etc. For example, you would define a `module FooHelper` in `app/helpers/foo_helper.rb`.
|
31
|
-
app/partials | Your partials that can to be included in other scripts. This is used in conjunction with the `partial` helper method.
|
56
|
+
app/partials | Your partials that can to be included in other scripts. This is used in conjunction with the `partial` helper method. With great power comes great responsibility. It is recommended to use partials sparely to keep scripts more straightforward.
|
32
57
|
app/scripts | Where you define common scripts that can be used to configure the server. These scripts can be automatically uploaded to an s3 bucket for later downloading in your user-data script by setting the `scripts_s3_bucket` config option.
|
33
58
|
app/user-data | Your user-data scripts that are used to bootstrap EC2 instance.
|
34
59
|
config/[AWS_EC2_ENV].yml | The config file where you set configs that you want available in your templating logic. Examples are: `config/development.yml` and `config/production.yml`. You access the config variables with the `<%= config["var"] %>` helper.
|
35
|
-
|
36
|
-
|
60
|
+
app/user-data/layouts | user-data scripts support layouts. You user-data layouts go in here.
|
61
|
+
profiles | Your profile files. These files mainly contain parameters that are passed to the aws-sdk run_instances API method.
|
62
|
+
tmp | Where the generated scripts get compiled to. You can manually invoke the compilation via `aws-ec2 compile` to inspect what is generated. This is automatically done as part of the `aws-ec2` create command.
|
37
63
|
|
38
64
|
## Helpers
|
39
65
|
|
@@ -43,7 +69,7 @@ Helper | Description
|
|
43
69
|
------------- | -------------
|
44
70
|
user_data | Allows you to embed a generated user_data script. More details on the user-data are provided in the user data section below.
|
45
71
|
config | Access to the variables set in config/[AWS_EC2_ENV].yml. Examples are `config/development.yml` and `config/production.yml`.
|
46
|
-
latest_ami | Returns an AMI id by searching the AMI name pattern and sorting in reverse
|
72
|
+
latest_ami | Returns an AMI id by searching the AMI name pattern and sorting in reverse order. Example: `latest_ami("ruby-2.5.0_*")` would return the latest ruby AMIs are named with timestamps at the end like so: `ruby-2.5.0_2018-01-30-05-36-02` and `ruby-2.5.0_2018-01-29-05-36-02`.
|
47
73
|
search_ami | Returns a collection of AMI image objects based on a search pattern. The query searches on the AMI name.
|
48
74
|
|
49
75
|
For a full list of all the template helpers check out: [aws_ec2/template_helper](lib/aws_ec2/template_helper).
|
@@ -56,14 +82,14 @@ You can provide a user-data script to customize the server upon launch. The use
|
|
56
82
|
|
57
83
|
* app/user-data/myserver.yml
|
58
84
|
|
59
|
-
The user-data script is generated on the machine that is running the aws-ec2 command. If this is your local macosx machine, then the context of your local macosx machine is available. To see the generated user-data script, you can run the create command in noop mode and then inspect the generated script. Example:
|
85
|
+
The user-data script is generated on the machine that is running the aws-ec2 command. If this is your local macosx machine, then the context of your local macosx machine is available. To see the generated user-data script, you can run the create command in `--noop` mode and then inspect the generated script. Example:
|
60
86
|
|
61
87
|
```sh
|
62
88
|
aws-ec2 create myserver --noop
|
63
89
|
cat tmp/user-data.txt
|
64
90
|
```
|
65
91
|
|
66
|
-
Another way to view the generated user-data scripts is the `aws-ec2 compile` command. It generates the files in the tmp folder. Example:
|
92
|
+
Another way to view the generated user-data scripts is the `aws-ec2 compile` command. It generates the files in the `tmp` folder. Example:
|
67
93
|
|
68
94
|
```
|
69
95
|
aws-ec2 compile # generates files in tmp folder
|
@@ -76,6 +102,43 @@ $ grep user_data profiles/default.yml
|
|
76
102
|
user_data: "<%= user_data("bootstrap") %>"
|
77
103
|
```
|
78
104
|
|
105
|
+
### User-Data Layouts
|
106
|
+
|
107
|
+
User-data scripts support layouts. This is useful if you have common setup and finish code with your user-data scripts. Here's an example: `app/user-data/layouts/default.sh`:
|
108
|
+
|
109
|
+
```bash
|
110
|
+
#!/bin/bash
|
111
|
+
# do some setup
|
112
|
+
<%= yield %>
|
113
|
+
# finish work
|
114
|
+
```
|
115
|
+
|
116
|
+
And `app/user-data/box.sh`:
|
117
|
+
|
118
|
+
```
|
119
|
+
yum install -y vim
|
120
|
+
```
|
121
|
+
|
122
|
+
The resulting generated user-data script will be:
|
123
|
+
|
124
|
+
```bash
|
125
|
+
#!/bin/bash
|
126
|
+
# do some setup
|
127
|
+
yum install -y vim
|
128
|
+
# finish work
|
129
|
+
```
|
130
|
+
|
131
|
+
You can specify the layout to use when you call the `user_data` helper method in your profile. Example: `profiles/box.yml`:
|
132
|
+
|
133
|
+
```yaml
|
134
|
+
---
|
135
|
+
...
|
136
|
+
user_data: <%= user_data("box.sh", layout: "mylayout" ) %>
|
137
|
+
...
|
138
|
+
```
|
139
|
+
|
140
|
+
If there's a `layouts/default.sh`, then it will automatically be used without having to specify the layout option. You can disable this behavior by passing in `layout: false` or by deleting the `layouts/default.sh` file.
|
141
|
+
|
79
142
|
### Config
|
80
143
|
|
81
144
|
You can set variables in a config file and they are available when ERB is available: profiles, user-data, scripts, etc. Example `config/development.yml`:
|
@@ -112,6 +175,10 @@ Option | Description
|
|
112
175
|
--- | ---
|
113
176
|
scripts_s3_bucket | Set this to the bucket name where you want the generated scripts in app/scripts and app/user-data to be uploaded to. The upload sync happens right before the internal to run_instances call that launches the instance. If you need more custom logic, you can use the `before_run_instances` hook, covered in the Hooks section.
|
114
177
|
|
178
|
+
### Settings
|
179
|
+
|
180
|
+
A `config/settings.yml` file controls the internal behavior of aws-ec2. It is different from config files which are meant for user defined varibles. Settings variables are for internal use.
|
181
|
+
|
115
182
|
### Hooks
|
116
183
|
|
117
184
|
There is only one hook: `before_run_instances`. You can configure this with `config/hooks.yml`: Example:
|
data/Rakefile
CHANGED
data/aws-ec2.gemspec
CHANGED
@@ -19,17 +19,19 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency "thor"
|
23
|
-
spec.add_dependency "hashie"
|
24
|
-
spec.add_dependency "colorize"
|
25
|
-
spec.add_dependency "dotenv"
|
26
22
|
spec.add_dependency "activesupport"
|
27
23
|
spec.add_dependency "aws-sdk-ec2"
|
24
|
+
spec.add_dependency "colorize"
|
25
|
+
spec.add_dependency "dotenv"
|
26
|
+
spec.add_dependency "filesize"
|
27
|
+
spec.add_dependency "hashie"
|
28
|
+
spec.add_dependency "render_me_pretty"
|
29
|
+
spec.add_dependency "thor"
|
28
30
|
|
29
31
|
spec.add_development_dependency "bundler"
|
30
32
|
spec.add_development_dependency "byebug"
|
31
|
-
spec.add_development_dependency "rake"
|
32
33
|
spec.add_development_dependency "guard"
|
33
34
|
spec.add_development_dependency "guard-bundler"
|
34
35
|
spec.add_development_dependency "guard-rspec"
|
36
|
+
spec.add_development_dependency "rake"
|
35
37
|
end
|
data/lib/aws-ec2.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
$:.unshift(File.expand_path("../", __FILE__))
|
2
2
|
require "aws_ec2/version"
|
3
3
|
require "colorize"
|
4
|
+
require "render_me_pretty"
|
4
5
|
|
5
6
|
module AwsEc2
|
6
7
|
autoload :Help, "aws_ec2/help"
|
@@ -11,13 +12,15 @@ module AwsEc2
|
|
11
12
|
autoload :Base, "aws_ec2/base"
|
12
13
|
autoload :Create, "aws_ec2/create"
|
13
14
|
autoload :Ami, "aws_ec2/ami"
|
14
|
-
autoload :
|
15
|
+
autoload :Template, "aws_ec2/template"
|
15
16
|
autoload :Script, "aws_ec2/script"
|
16
17
|
autoload :Config, "aws_ec2/config"
|
17
18
|
autoload :Core, "aws_ec2/core"
|
18
19
|
autoload :Dotenv, "aws_ec2/dotenv"
|
19
20
|
autoload :Hook, "aws_ec2/hook"
|
20
|
-
|
21
|
+
autoload :Completion, "aws_ec2/completion"
|
22
|
+
autoload :Completer, "aws_ec2/completer"
|
23
|
+
autoload :Setting, "aws_ec2/setting"
|
21
24
|
extend Core
|
22
25
|
end
|
23
26
|
|
data/lib/aws_ec2/ami.rb
CHANGED
data/lib/aws_ec2/base.rb
CHANGED
@@ -1,9 +1,42 @@
|
|
1
1
|
module AwsEc2
|
2
2
|
class Base
|
3
|
+
# constants really only used by script classes
|
4
|
+
SCRIPTS_INFO_PATH = "tmp/data/scripts_info.txt"
|
5
|
+
BUILD_ROOT = "tmp"
|
6
|
+
|
3
7
|
def initialize(options={})
|
4
8
|
@options = options.clone
|
9
|
+
@name = randomize(@options[:name])
|
5
10
|
AwsEc2.validate_in_project!
|
6
|
-
Profile.new(@options).check!
|
7
11
|
end
|
12
|
+
|
13
|
+
# Appends a short random string at the end of the ec2 instance name.
|
14
|
+
# Later we will strip this same random string from the name.
|
15
|
+
# Very makes it convenient. We can just type:
|
16
|
+
#
|
17
|
+
# aws-ec2 create server --randomize
|
18
|
+
#
|
19
|
+
# instead of:
|
20
|
+
#
|
21
|
+
# aws-ec2 create server-123 --profile server
|
22
|
+
#
|
23
|
+
def randomize(name)
|
24
|
+
if @options[:randomize]
|
25
|
+
random = (0...3).map { (65 + rand(26)).chr }.join.downcase # Ex: jhx
|
26
|
+
[name, random].join('-')
|
27
|
+
else
|
28
|
+
name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Strip the random string at end of the ec2 instance name
|
33
|
+
def derandomize(name)
|
34
|
+
if @options[:randomize]
|
35
|
+
name.sub(/-(\w{3})$/,'') # strip the random part at the end
|
36
|
+
else
|
37
|
+
name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
8
41
|
end
|
9
42
|
end
|
data/lib/aws_ec2/cli.rb
CHANGED
@@ -8,6 +8,7 @@ module AwsEc2
|
|
8
8
|
option :ami_name, desc: "when specified, an ami creation script is appended to the user-data script"
|
9
9
|
option :auto_terminate, type: :boolean, default: false, desc: "automatically terminate the instance at the end of user-data"
|
10
10
|
option :source_ami, desc: "override the source image_id in profile"
|
11
|
+
option :randomize, type: :boolean, desc: "append random characters to end of name"
|
11
12
|
def create(name)
|
12
13
|
Create.new(options.merge(name: name)).run
|
13
14
|
end
|
@@ -21,8 +22,9 @@ module AwsEc2
|
|
21
22
|
|
22
23
|
desc "compile", "compiles app/scripts and app/user-data to tmp folder"
|
23
24
|
long_desc Help.text(:compile)
|
25
|
+
option :layout, default: "default", desc: "layout for user_data helper"
|
24
26
|
def compile
|
25
|
-
Script::Compile.new(options).
|
27
|
+
Script::Compile.new(options).compile_all
|
26
28
|
end
|
27
29
|
|
28
30
|
desc "upload", "compiles and uploads scripts to s3"
|
@@ -31,5 +33,22 @@ module AwsEc2
|
|
31
33
|
def upload
|
32
34
|
Script::Upload.new(options).upload
|
33
35
|
end
|
36
|
+
|
37
|
+
desc "completion *PARAMS", "Prints words for auto-completion."
|
38
|
+
long_desc Help.text("completion")
|
39
|
+
def completion(*params)
|
40
|
+
Completer.new(CLI, *params).run
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "completion_script", "Generates a script that can be eval to setup auto-completion."
|
44
|
+
long_desc Help.text("completion_script")
|
45
|
+
def completion_script
|
46
|
+
Completer::Script.generate
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "version", "prints version"
|
50
|
+
def version
|
51
|
+
puts VERSION
|
52
|
+
end
|
34
53
|
end
|
35
54
|
end
|