bin_diesel 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.travis.yml +10 -0
- data/Examples/purge_files.rb +85 -0
- data/Examples/test.rb +48 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +24 -0
- data/README.md +240 -0
- data/Rakefile +10 -0
- data/bin_diesel.gemspec +25 -0
- data/lib/bin_diesel.rb +185 -0
- data/lib/bin_diesel/version.rb +3 -0
- data/test/lib/bin_diesel/version_test.rb +7 -0
- data/test/lib/bin_diesel_test.rb +462 -0
- data/test/test_diesel.rb +5 -0
- data/test/test_helper.rb +29 -0
- metadata +133 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
class PurgeableFileList
|
4
|
+
KNOWN_SKIPPABLES = ['.', '..']
|
5
|
+
attr_reader :files
|
6
|
+
def initialize path, age
|
7
|
+
@path = path
|
8
|
+
@age_cutoff = Time.zone.now - age.days
|
9
|
+
generate_file_list
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def generate_file_list
|
14
|
+
get_all_files_in_purge_directory
|
15
|
+
remove_known_skippable_files
|
16
|
+
remove_files_too_young_to_purge
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_all_files_in_purge_directory
|
20
|
+
@files = Dir.entries(@path)
|
21
|
+
@files.map!{|file| File.join(@path, file)}
|
22
|
+
end
|
23
|
+
|
24
|
+
def remove_known_skippable_files
|
25
|
+
@files = @files - KNOWN_SKIPPABLES
|
26
|
+
end
|
27
|
+
def remove_files_too_young_to_purge
|
28
|
+
@files.reject!{|file| File.mtime(file) > @age_cutoff }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class PurgeFiles
|
33
|
+
DEFAULT_DAYS_TO_KEEP = 30
|
34
|
+
|
35
|
+
opts_banner = "Usage: ./purge_report_files.rb [options]"
|
36
|
+
opts_description "By default, this will purge UI Report Files, though it can be\nturned on other things with the proper options."
|
37
|
+
|
38
|
+
opts_required :path_to_purge
|
39
|
+
opts_accessor :keep_n_days, :path_to_purge
|
40
|
+
|
41
|
+
opts_on("-k", "--keep-n-days DAYS", Integer, "Keep N days of files.", "\tDefault: --keep-n-days #{DEFAULT_DAYS_TO_KEEP}") do |days|
|
42
|
+
options.keep_n_days = days
|
43
|
+
end
|
44
|
+
|
45
|
+
opts_on("-p", "--path-to-purge PATH", "Purge files from PATH", "Required") do |path|
|
46
|
+
options.path_to_purge = path
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def post_initialize
|
51
|
+
options.keep_n_days ||= DEFAULT_DAYS_TO_KEEP
|
52
|
+
end
|
53
|
+
|
54
|
+
run do
|
55
|
+
message "Checking for directory #{options.patth_to_purge}."
|
56
|
+
if directory_found?
|
57
|
+
message "Directory #{options.path_to_purge} found."
|
58
|
+
message "Getting list of files."
|
59
|
+
message "#{files.size} files found."
|
60
|
+
remove_files
|
61
|
+
message "Fin!"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def directory_found?
|
68
|
+
found = File.directory? path_to_purge
|
69
|
+
error_message "Directory '#{options.path_to_purge}'not found." unless found
|
70
|
+
found
|
71
|
+
end
|
72
|
+
|
73
|
+
def files
|
74
|
+
@files ||= PurgeableFileList.new(path_to_purge, keep_n_days).files
|
75
|
+
end
|
76
|
+
|
77
|
+
def remove_files
|
78
|
+
files.each do |file|
|
79
|
+
message "Deleting '#{file}'."
|
80
|
+
File.delete(file) unless options.dry_run
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
exit PurgeFiles.new(ARGV).run
|
data/Examples/test.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
# This require allows you to load the Rails environment for use in your scripts.
|
4
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'../config/environment.rb'))
|
5
|
+
|
6
|
+
class Test
|
7
|
+
# We are using ActiveSupport Concern. You'll need to do this. If you don't
|
8
|
+
# include the Rails environment as part of loading, you'll have to load
|
9
|
+
# lib/bin_diesel.rb first.
|
10
|
+
include BinDiesel
|
11
|
+
|
12
|
+
# Message says it all
|
13
|
+
def post_initialize
|
14
|
+
message "This runs after you initialize the your instance. Could be handy."
|
15
|
+
message "You don't need to provide me."
|
16
|
+
end
|
17
|
+
|
18
|
+
# opts_banner is the standard header for how to execute your script.
|
19
|
+
opts_banner "Usage: ./my_parse_example.rb [options]"
|
20
|
+
|
21
|
+
# opts_descriptions is the description of what this script does.
|
22
|
+
opts_description "By default, this will be an awesome description."
|
23
|
+
opts_description "You can have as many descriptions as you like,\nor add line breaks manually."
|
24
|
+
|
25
|
+
# opts_on is how you specify additional options for your script
|
26
|
+
# You have access to 'options', which is a struct for holding your options.
|
27
|
+
# options.dry_run and options.verbose are provided by default, set to false.
|
28
|
+
# It takes the option flags, description strings, and a block. Only the first
|
29
|
+
# option flag is required.
|
30
|
+
opts_on "-p", "--pass-param PARAM", "Pass a param" do |param|
|
31
|
+
options.param = param
|
32
|
+
end
|
33
|
+
opts_on "-r", "--run-fast", "Something" do
|
34
|
+
options.fast = true
|
35
|
+
end
|
36
|
+
opts_on "-x", "marks the spot"
|
37
|
+
|
38
|
+
# run is is the big deal. It is what will get run when you execute
|
39
|
+
# your script. It evaluated in an instance context.
|
40
|
+
run do
|
41
|
+
message "I only show up if we are verbose and executing."
|
42
|
+
puts options
|
43
|
+
puts "INSERT CODE WITH SIDE EFFECTS HERE. :)"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
# Run this script ala the command line...
|
47
|
+
# exit Test.new(ARGV).run
|
48
|
+
# > ./bin/test -v
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
Copyright (c) 2013, Andrew J Vargo
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
* Redistributions of source code must retain the above copyright
|
7
|
+
notice, this list of conditions and the following disclaimer.
|
8
|
+
* Redistributions in binary form must reproduce the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer in the
|
10
|
+
documentation and/or other materials provided with the distribution.
|
11
|
+
* Neither the name of the <organization> nor the
|
12
|
+
names of its contributors may be used to endorse or promote products
|
13
|
+
derived from this software without specific prior written permission.
|
14
|
+
|
15
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
16
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
17
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
18
|
+
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
19
|
+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
20
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
21
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
22
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
23
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
24
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,240 @@
|
|
1
|
+
# Bin Diesel
|
2
|
+
|
3
|
+
## Build Status
|
4
|
+
|
5
|
+
![Build Status](https://api.travis-ci.org/dataxu/bin_diesel.png)
|
6
|
+
|
7
|
+
[Brought to you by the fine folks at Travis-CI](https://travis-ci.org/dataxu/bin_diesel)
|
8
|
+
|
9
|
+
## Introduction
|
10
|
+
Bin Diesel is a utility that will allow you to create re-usable, executable scripts easier.
|
11
|
+
|
12
|
+
Bin Diesel abstracts option parsing to simplify your 'bin' scripting. It provides a number of wrapper methods for OptionParser, so I'd suggest having a look at that documentation to understand more of what this provides. [OptionParser Complete Example](http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html#label-Complete+example)
|
13
|
+
|
14
|
+
## What's provided? AKA, the API
|
15
|
+
|
16
|
+
It is important to note that methods are executed in the order defined. This means you should set all options and text helpers *before* defining `run`.
|
17
|
+
|
18
|
+
### Default options
|
19
|
+
|
20
|
+
Using Bin Diesel, you get the following options for free:
|
21
|
+
|
22
|
+
* `-d`, `--dry-run`, Run script without any real changes. Sets `@dry_run` and `options.dry_run` to `true`. Sets --verbose by default.`
|
23
|
+
|
24
|
+
The intent of `--dry-run` is to provide you with a way to run through the script and note output to verify that the script runs as intended.
|
25
|
+
We generally use this flag on `ActiveRecord` calls. For example:
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
# ...
|
29
|
+
run do
|
30
|
+
users = User.where(organization: Organization.where(name: 'DataXu'))
|
31
|
+
message "Updating #{users.count} DataXu users to be admins"
|
32
|
+
users.update_all(admin: true) unless options.dry_run
|
33
|
+
end
|
34
|
+
# ...
|
35
|
+
```
|
36
|
+
|
37
|
+
The first time through, users can run the script with `--dry-run` and note the number of users that would be modified. A second run of the script without the `--dry-run` option
|
38
|
+
will make the modifications.
|
39
|
+
|
40
|
+
* `-v, --[no-]verbose, Run verbosely`
|
41
|
+
|
42
|
+
* `-h, --help, Show description and options, and exit`
|
43
|
+
|
44
|
+
### Attributes for your ready use
|
45
|
+
|
46
|
+
* `verbose` - false by default
|
47
|
+
|
48
|
+
The built in message helpers won't print if verbose if false, saving you the hassle.
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
puts 'Something' if verbose
|
52
|
+
message "Event" # I only print if verbose is true!
|
53
|
+
```
|
54
|
+
|
55
|
+
* `options`
|
56
|
+
|
57
|
+
This is a struct that allows you to access options you configure. Options are generally defined in `opts_on` blocks. For example:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
class SimpleScript
|
61
|
+
include BinDiesel
|
62
|
+
|
63
|
+
# Accepts three arguments and a block. The signature is:
|
64
|
+
# opts_on [short flag], [long flag], [help text for the option]
|
65
|
+
opts_on '-f', '--file [FILE]', 'The file to operate on' do |file_name|
|
66
|
+
options.file_name = file_name
|
67
|
+
end
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
The first two arguments define the short and long switches for the option. The remaining N arguments are used as a description of the option (separated by newlines) displayed when the '--help' switch is provided.
|
72
|
+
|
73
|
+
See [the OptionParser documentation for `#make_switch`](http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html#method-i-make_switch) for
|
74
|
+
a description of the arguments `opts_on` accepts. If the defined option accepts a value, the value will be passed to the block.
|
75
|
+
|
76
|
+
* `dry_run` - false by default. This is also available through `options.dry_run`.
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
do_irrevocable_change unless dry_run
|
80
|
+
```
|
81
|
+
|
82
|
+
* `args`
|
83
|
+
|
84
|
+
The args passed in to the run method. You may have a required thing that isn't a `--option` you need to use. This is generally an array that looks something like this (depending on the options supplied at the command line):
|
85
|
+
|
86
|
+
```ruby
|
87
|
+
['--file', 'file_name.txt', '--verbose', '--dry-run']
|
88
|
+
```
|
89
|
+
|
90
|
+
### Methods for your use
|
91
|
+
|
92
|
+
* `opts_banner(text)`
|
93
|
+
|
94
|
+
Set banner text for your script. Usually the bare usage line to show an example run.
|
95
|
+
|
96
|
+
* `opts_description(text)`
|
97
|
+
|
98
|
+
Longer form text explaining what your script does.
|
99
|
+
|
100
|
+
* `opts_on *opts, &block`
|
101
|
+
|
102
|
+
Meat and potatoes. This is what you'll use to set your own options. The examples provided or [OptionParser Complete example](http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html#label-Complete+example) will give you more of an idea of what is possible. Also see [the OptionParser documentation for `#make_switch`](http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html#method-i-make_switch).
|
103
|
+
|
104
|
+
Note the usage of `options` in the block to set values you'll use in your executing code. Instance variables (instead of using `options`) are also acceptable.
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
opts.on("-d", "--dry-run", "Run script without any real changes.", "\tSets --verbose by default.") do |dry_run|
|
108
|
+
options.dry_run = true
|
109
|
+
options.verbose = true
|
110
|
+
end
|
111
|
+
```
|
112
|
+
|
113
|
+
* `opts_required *args`
|
114
|
+
|
115
|
+
When parsing is done, `OptionParser::MissingArguement` will be raised for anything specified here that `options` does not respond to.
|
116
|
+
|
117
|
+
```ruby
|
118
|
+
opts_required :path
|
119
|
+
# if you never set options.path, things go BOOM.
|
120
|
+
```
|
121
|
+
|
122
|
+
* `opts_accessor *args`
|
123
|
+
|
124
|
+
Turns the provided args into accessors to help in your script writing.
|
125
|
+
|
126
|
+
```ruby
|
127
|
+
opts_accessor :path
|
128
|
+
# allows
|
129
|
+
File.open path
|
130
|
+
# instead of
|
131
|
+
File.open options.path
|
132
|
+
# or
|
133
|
+
File.open @path
|
134
|
+
```
|
135
|
+
|
136
|
+
* `dry_run?`
|
137
|
+
|
138
|
+
Some sugar for checking if `dry_run` was set.
|
139
|
+
|
140
|
+
```ruby
|
141
|
+
save_records unless dry_run?
|
142
|
+
```
|
143
|
+
|
144
|
+
* `post_initialize`
|
145
|
+
|
146
|
+
Provided so you don't have to overide Bin Diesel's initialize method. It executes *after* all the parsing and what not, so you'll have access to options and the accessors.
|
147
|
+
|
148
|
+
```ruby
|
149
|
+
class SimpleExample
|
150
|
+
include BinDiesel
|
151
|
+
|
152
|
+
post_initialize do
|
153
|
+
# Set some other useful instance variables
|
154
|
+
@base_directory = File.dirname(__FILE__)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
```
|
158
|
+
|
159
|
+
* `run &block`
|
160
|
+
|
161
|
+
This is the big deal of your script. You should use this as the method that'll be called to kick off your script. We do nice things for you, like catch exceptions and exit and return 1 or return 0 if all goes well.
|
162
|
+
|
163
|
+
If `run` is not implemented, the script will raise `NotImplementedError.
|
164
|
+
|
165
|
+
```ruby
|
166
|
+
run do
|
167
|
+
campaigns = find_campaigns(options.campaign_uids)
|
168
|
+
campaigns.each do |campaign|
|
169
|
+
campaign.update_attribute(:name, "#{campaign.name} Update Example") unless options.dry_run
|
170
|
+
end
|
171
|
+
end
|
172
|
+
```
|
173
|
+
|
174
|
+
* `message(text)`
|
175
|
+
|
176
|
+
puts text if `verbose` is set to `false`. This is an extremely simple wrapper around `puts`:
|
177
|
+
|
178
|
+
```ruby
|
179
|
+
def message(text)
|
180
|
+
puts text if verbose
|
181
|
+
end
|
182
|
+
```
|
183
|
+
|
184
|
+
* `info_message(text)`
|
185
|
+
|
186
|
+
Like `message`, but prepends with `**`
|
187
|
+
|
188
|
+
* `error_message(text)`
|
189
|
+
|
190
|
+
`puts` text, no matter the setting of `verbose`. It also prepends text with "!! "
|
191
|
+
|
192
|
+
## Installation
|
193
|
+
|
194
|
+
Add this line to your application's Gemfile:
|
195
|
+
|
196
|
+
gem 'bin_diesel'
|
197
|
+
|
198
|
+
And then execute:
|
199
|
+
|
200
|
+
$ bundle
|
201
|
+
|
202
|
+
Or install it yourself as:
|
203
|
+
|
204
|
+
$ gem install bin_diesel
|
205
|
+
|
206
|
+
## Usage
|
207
|
+
|
208
|
+
This is the most basic way to use Bin Diesel:
|
209
|
+
|
210
|
+
```ruby
|
211
|
+
#! /usr/bin/env ruby
|
212
|
+
|
213
|
+
class MyScript
|
214
|
+
include BinDiesel # ahh yeah, goodies
|
215
|
+
|
216
|
+
post_initialize do
|
217
|
+
# Do some stuff with options before `run` is called
|
218
|
+
end
|
219
|
+
|
220
|
+
run do
|
221
|
+
# I am required and will throw and exception if not defined.
|
222
|
+
# This is what you should call, and should contain the main logic of your script.
|
223
|
+
# If there is no exception, it'll return 0, otherwise 1 for use as an exit code
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
if __FILE__ == $0 # don't run it if not called alone
|
228
|
+
exit MyScript.new(ARGV).run # the 0 or 1 allows you to get a proper exit code
|
229
|
+
end
|
230
|
+
```
|
231
|
+
|
232
|
+
See the Examples directory for more examples.
|
233
|
+
|
234
|
+
## Contributing
|
235
|
+
|
236
|
+
1. Fork it
|
237
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
238
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
239
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
240
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/bin_diesel.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'bin_diesel/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "bin_diesel"
|
8
|
+
spec.version = BinDiesel::VERSION
|
9
|
+
spec.authors = ["Andrew J Vargo", "Anthony White"]
|
10
|
+
spec.email = ["avargo@dataxu.com", "awhite@dataxu.com"]
|
11
|
+
spec.description = %q{Bin Diesel allows you to write scripts relying on Option Parser with DSL that eliminates the boiler plate code. Define options and run. }
|
12
|
+
spec.summary = %q{Easier "bin" scripts built with Option Parser.}
|
13
|
+
spec.homepage = "http://www.dataxu.com"
|
14
|
+
spec.license = "New BSD License"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "minitest"
|
24
|
+
spec.add_development_dependency "debugger"
|
25
|
+
end
|
data/lib/bin_diesel.rb
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
require_relative "bin_diesel/version"
|
2
|
+
require 'optparse'
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
|
6
|
+
module BinDiesel
|
7
|
+
OPTS = {:banner => nil, :description => [], :user_options => [], :required_options => [], :accessible_options => []}
|
8
|
+
attr_reader :verbose, :options, :args, :dry_run
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def run &block
|
12
|
+
define_method :run do
|
13
|
+
begin
|
14
|
+
puts "DRY RUN" if options.dry_run
|
15
|
+
instance_eval(&block)
|
16
|
+
ending = happy_ending
|
17
|
+
rescue Exception => e
|
18
|
+
error_message "FAILED: #{e.message}"
|
19
|
+
puts e.backtrace
|
20
|
+
ending = unhappy_ending
|
21
|
+
ensure
|
22
|
+
ending
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def post_initialize &block
|
28
|
+
define_method :post_initialize do
|
29
|
+
instance_eval(&block)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def opts_banner text
|
34
|
+
OPTS[:banner] = text
|
35
|
+
end
|
36
|
+
|
37
|
+
def opts_description text
|
38
|
+
OPTS[:description] << text
|
39
|
+
end
|
40
|
+
|
41
|
+
def opts_on *opts, &block
|
42
|
+
OPTS[:user_options] << {:options => opts, :block => block }
|
43
|
+
end
|
44
|
+
|
45
|
+
def opts_required *args
|
46
|
+
OPTS[:required_options] += args
|
47
|
+
end
|
48
|
+
|
49
|
+
def opts_accessor *args
|
50
|
+
OPTS[:accessible_options] += args
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
module InstanceMethods
|
55
|
+
def initialize args=["--help"]
|
56
|
+
@args = args
|
57
|
+
@options = OpenStruct.new(:dry_run => false, :verbose => false)
|
58
|
+
|
59
|
+
begin
|
60
|
+
parse_options
|
61
|
+
rescue OptionParser::MissingArgument => e
|
62
|
+
error_message e.message
|
63
|
+
exit unhappy_ending
|
64
|
+
end
|
65
|
+
|
66
|
+
@verbose = @options.verbose
|
67
|
+
@dry_run = @options.dry_run
|
68
|
+
|
69
|
+
setup_option_accessors
|
70
|
+
|
71
|
+
begin
|
72
|
+
post_initialize
|
73
|
+
rescue Exception => e
|
74
|
+
error_message e.message
|
75
|
+
exit unhappy_ending
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def dry_run?
|
80
|
+
@options.dry_run
|
81
|
+
end
|
82
|
+
|
83
|
+
def run
|
84
|
+
raise NotImplementedError, "#{self.class} does not implement method run. You may do this explictly, or via the class level DSL (recommended):\nrun do\n ...\nend"
|
85
|
+
end
|
86
|
+
|
87
|
+
def post_initialize
|
88
|
+
# TODO: EXPLAIN ME
|
89
|
+
end
|
90
|
+
|
91
|
+
def message text
|
92
|
+
puts text if verbose
|
93
|
+
end
|
94
|
+
|
95
|
+
def info_message text
|
96
|
+
message "** #{text}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def error_message text
|
100
|
+
# Always print out error messages, regardless of verbose mode
|
101
|
+
puts "!! #{text}"
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def happy_ending
|
107
|
+
0
|
108
|
+
end
|
109
|
+
|
110
|
+
def unhappy_ending
|
111
|
+
1
|
112
|
+
end
|
113
|
+
|
114
|
+
def setup_option_accessors
|
115
|
+
OPTS[:accessible_options].each do |opt|
|
116
|
+
define_singleton_method opt do
|
117
|
+
@options.send(opt)
|
118
|
+
end
|
119
|
+
|
120
|
+
define_singleton_method "#{opt}=" do |val|
|
121
|
+
@options.send("#{opt}=", val)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def parse_options
|
127
|
+
opts = OptionParser.new do |opt_parser|
|
128
|
+
opt_parser.banner = OPTS[:banner]
|
129
|
+
opt_parser.separator ""
|
130
|
+
|
131
|
+
OPTS[:description].each{|description| opt_parser.separator description }
|
132
|
+
opt_parser.separator ""
|
133
|
+
|
134
|
+
opt_parser.separator "Specific options:"
|
135
|
+
opt_parser.on("-d", "--dry-run", "Run script without any real changes.", "\tSets --verbose by default.") do |dry_run|
|
136
|
+
options.dry_run = true
|
137
|
+
options.verbose = true
|
138
|
+
end
|
139
|
+
|
140
|
+
opt_parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
141
|
+
options.verbose = v
|
142
|
+
end
|
143
|
+
opt_parser.separator ""
|
144
|
+
|
145
|
+
# USER SPECIFIED
|
146
|
+
OPTS[:user_options].each do |option|
|
147
|
+
# We allow the user to define the proc for the opts.on block via option[:block].
|
148
|
+
# OptionParser can get confused by the last argument (the block), and sometimes defines it twice,
|
149
|
+
# which blows up spectacularly with an ArgumentError
|
150
|
+
option[:options].reject! {|o| o.class.to_s == 'Proc'}
|
151
|
+
|
152
|
+
if option[:block]
|
153
|
+
opt_parser.on(*(option[:options] << Proc.new{|*args| self.instance_exec(*args, &option[:block])}))
|
154
|
+
else
|
155
|
+
opt_parser.on(*option[:options])
|
156
|
+
end
|
157
|
+
end
|
158
|
+
opt_parser.separator ""
|
159
|
+
|
160
|
+
opt_parser.separator "Common options:"
|
161
|
+
opt_parser.on_tail("-h", "--help", "Show this message") do
|
162
|
+
puts opt_parser
|
163
|
+
exit happy_ending
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
the_options = opts.parse! args
|
168
|
+
|
169
|
+
OPTS[:required_options].each do |required_option|
|
170
|
+
raise OptionParser::MissingArgument.new("#{optionize(required_option.to_s)} - Run with --help for help.") if @options.send(required_option).nil?
|
171
|
+
end
|
172
|
+
|
173
|
+
the_options
|
174
|
+
end
|
175
|
+
|
176
|
+
def optionize string
|
177
|
+
"--#{string.gsub('_', '-')}"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def self.included(base)
|
182
|
+
base.send :include, InstanceMethods
|
183
|
+
base.send :extend, ClassMethods
|
184
|
+
end
|
185
|
+
end
|
@@ -0,0 +1,462 @@
|
|
1
|
+
require_relative '../../lib/bin_diesel'
|
2
|
+
require_relative '../test_helper'
|
3
|
+
|
4
|
+
describe BinDiesel do
|
5
|
+
describe "help flag" do
|
6
|
+
it 'is equivalent to call -h and --help' do
|
7
|
+
vincent = Class.new(TestDiesel)
|
8
|
+
|
9
|
+
help_output = capture_std_out do
|
10
|
+
swallow_exit { vincent.new(['--help']).run }
|
11
|
+
end
|
12
|
+
|
13
|
+
h_output = capture_std_out do
|
14
|
+
swallow_exit { vincent.new(['-h']).run }
|
15
|
+
end
|
16
|
+
|
17
|
+
help_output.must_equal(h_output)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'swallows other options if help is called' do
|
21
|
+
vincent = Class.new(TestDiesel) do
|
22
|
+
opts_banner "This is my banner"
|
23
|
+
|
24
|
+
opts_on '-e', '--error', 'Raise an error' do
|
25
|
+
options.error = "Raised error"
|
26
|
+
end
|
27
|
+
|
28
|
+
run do
|
29
|
+
puts options.error
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
swallow_exit do
|
34
|
+
lambda { vincent.new(['--error', '--help']).run }.must_output "This is my banner"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'raises a system exit' do
|
39
|
+
vincent = Class.new(TestDiesel)
|
40
|
+
swallow_std_out do
|
41
|
+
lambda{ vincent.new(["--help"]).run }.must_raise(SystemExit)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'is not required' do
|
46
|
+
vincent = Class.new(TestDiesel) do
|
47
|
+
opts_banner "And here is my banner"
|
48
|
+
end
|
49
|
+
|
50
|
+
swallow_exit do
|
51
|
+
lambda{ vincent.new.run }.must_output("-h, --help")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "opts_banner" do
|
56
|
+
it 'prints specified text on the first line when using a help flag' do
|
57
|
+
swallow_exit do
|
58
|
+
lambda{TestDiesel.new(["--help"]).run}.must_output("And here is my banner")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "opts_description" do
|
65
|
+
it 'prints in help text' do
|
66
|
+
vincent = Class.new(TestDiesel) do
|
67
|
+
opts_description "My description"
|
68
|
+
end
|
69
|
+
|
70
|
+
swallow_exit do
|
71
|
+
lambda { vincent.new(['--help']).run }.must_output("My description")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'prints after banner in help text' do
|
76
|
+
vincent = Class.new(TestDiesel) do
|
77
|
+
opts_banner "The banner"
|
78
|
+
opts_description "The description"
|
79
|
+
end
|
80
|
+
|
81
|
+
swallow_exit do
|
82
|
+
lambda { vincent.new(['--help']).run }.must_output("The banner\n\nThe description")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'is not required' do
|
87
|
+
vincent = Class.new(TestDiesel) do
|
88
|
+
opts_banner "My banner"
|
89
|
+
end
|
90
|
+
|
91
|
+
swallow_exit do
|
92
|
+
lambda { vincent.new(['--help']).run }.must_output("My banner")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'prints in order specified, on separate lines' do
|
97
|
+
vincent = Class.new(TestDiesel) do
|
98
|
+
opts_banner "My Banner"
|
99
|
+
|
100
|
+
opts_description "description 1"
|
101
|
+
opts_description "description 2"
|
102
|
+
end
|
103
|
+
|
104
|
+
swallow_exit do
|
105
|
+
lambda { vincent.new(['--help']).run }.must_output("description 1\ndescription 2")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "opts_required" do
|
111
|
+
it 'raises an error if option not given during execution' do
|
112
|
+
vincent = Class.new(TestDiesel) do
|
113
|
+
opts_on '-r', '--required OPTION', 'A required option' do |value|
|
114
|
+
options.required = value
|
115
|
+
end
|
116
|
+
|
117
|
+
opts_required :required
|
118
|
+
end
|
119
|
+
|
120
|
+
swallow_exit do
|
121
|
+
lambda { vincent.new([]) }.must_output("!! missing argument: --required - Run with --help for help")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'allows for more than one required option at a time' do
|
126
|
+
vincent = Class.new(TestDiesel) do
|
127
|
+
opts_on '-r', '--required OPTION', 'A required option' do |value|
|
128
|
+
options.required = value
|
129
|
+
end
|
130
|
+
|
131
|
+
opts_on '-o', '--option OPTION', 'Another required option' do |value|
|
132
|
+
options.option = value
|
133
|
+
end
|
134
|
+
|
135
|
+
opts_required :required, :option
|
136
|
+
end
|
137
|
+
|
138
|
+
swallow_exit do
|
139
|
+
-> { vincent.new([]) }.must_output "!! missing argument: --required"
|
140
|
+
-> { vincent.new(['--required', 'test']) }.must_output "!! missing argument: --option"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'allows for more than one required option, specified in different calls' do
|
145
|
+
vincent = Class.new(TestDiesel) do
|
146
|
+
opts_on '-r', '--required OPTION', 'A required option' do |value|
|
147
|
+
options.required = value
|
148
|
+
end
|
149
|
+
|
150
|
+
opts_on '-o', '--option OPTION', 'Another required option' do |value|
|
151
|
+
options.option = value
|
152
|
+
end
|
153
|
+
|
154
|
+
opts_required :required
|
155
|
+
opts_required :option
|
156
|
+
end
|
157
|
+
|
158
|
+
swallow_exit do
|
159
|
+
-> { vincent.new([]) }.must_output "!! missing argument: --required"
|
160
|
+
-> { vincent.new(['--required', 'test']) }.must_output "!! missing argument: --option"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
describe "opts_accessor" do
|
166
|
+
it 'sets an attribute_reader for the given option' do
|
167
|
+
vincent = Class.new(TestDiesel) do
|
168
|
+
opts_on '-o', '--option [OPTION]', 'An option' do |value|
|
169
|
+
options.option = value
|
170
|
+
end
|
171
|
+
|
172
|
+
opts_accessor :option
|
173
|
+
end
|
174
|
+
|
175
|
+
swallow_exit do
|
176
|
+
vincent.new(['--option', 'value']).option.must_equal('value')
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'allows for more than one option accessor at one time' do
|
181
|
+
vincent = Class.new(TestDiesel) do
|
182
|
+
opts_on '-o', '--option [OPTION]', 'An option' do |value|
|
183
|
+
options.option = value
|
184
|
+
end
|
185
|
+
|
186
|
+
opts_on '-a', '--another-option [OPTION]', 'Another option' do |value|
|
187
|
+
options.another_option = value
|
188
|
+
end
|
189
|
+
|
190
|
+
opts_accessor :option, :another_option
|
191
|
+
end
|
192
|
+
|
193
|
+
swallow_exit do
|
194
|
+
vincent.new(['--option', 'value']).option.must_equal('value')
|
195
|
+
vincent.new(['--another-option', 'value']).another_option.must_equal('value')
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'allows for more than one option accessor, specified in different calls' do
|
200
|
+
vincent = Class.new(TestDiesel) do
|
201
|
+
opts_on '-o', '--option [OPTION]', 'An option' do |value|
|
202
|
+
options.option = value
|
203
|
+
end
|
204
|
+
|
205
|
+
opts_on '-a', '--another-option [OPTION]', 'Another option' do |value|
|
206
|
+
options.another_option = value
|
207
|
+
end
|
208
|
+
|
209
|
+
opts_accessor :option
|
210
|
+
opts_accessor :another_option
|
211
|
+
end
|
212
|
+
|
213
|
+
swallow_exit do
|
214
|
+
vincent.new(['--option', 'value']).option.must_equal('value')
|
215
|
+
vincent.new(['--another-option', 'value']).another_option.must_equal('value')
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
describe "opts_on" do
|
222
|
+
it 'outputs help for the option with the --help flag' do
|
223
|
+
vincent = Class.new(TestDiesel) do
|
224
|
+
opts_on '-f', '--flag', 'A boolean flag' do |value|
|
225
|
+
options.flag = value
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
swallow_exit do
|
230
|
+
lambda { vincent.new(['--help']).run }.must_output("A boolean flag")
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'allows boolean options' do
|
235
|
+
vincent = Class.new(TestDiesel) do
|
236
|
+
opts_on '-b', '--boolean-flag', 'A boolean flag' do |value|
|
237
|
+
options.flag = value
|
238
|
+
end
|
239
|
+
|
240
|
+
run do
|
241
|
+
puts "flag: #{flag}"
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
swallow_exit do
|
246
|
+
vbomb = vincent.new(['--boolean-flag'])
|
247
|
+
vbomb.instance_variable_get(:@options).flag.must_equal(true)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'allows options with user supplied values' do
|
252
|
+
vincent = Class.new(TestDiesel) do
|
253
|
+
opts_on '-u', '--user-specified [OPTION]', 'A user specified option' do |value|
|
254
|
+
options.user_specified = value
|
255
|
+
end
|
256
|
+
|
257
|
+
run do
|
258
|
+
puts "user_specified: #{options.user_specified}"
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
swallow_exit do
|
263
|
+
vbomb = vincent.new(['--user-specified', 'option'])
|
264
|
+
vbomb.instance_variable_get(:@options).user_specified.must_equal('option')
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'accepts a short flag' do
|
269
|
+
vincent = Class.new(TestDiesel) do
|
270
|
+
opts_on '-s', '--short [OPTION]', 'A short option' do |value|
|
271
|
+
options.short = value
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
swallow_exit do
|
276
|
+
vbomb = vincent.new(['-s', 'short'])
|
277
|
+
vbomb.instance_variable_get(:@options).short.must_equal('short')
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
it 'accepts a long flag' do
|
282
|
+
vincent = Class.new(TestDiesel) do
|
283
|
+
opts_on '-l', '--long [OPTION]', 'A long flag' do |value|
|
284
|
+
options.long = value
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
swallow_exit do
|
289
|
+
vbomb = vincent.new(['--long', 'long'])
|
290
|
+
vbomb.instance_variable_get(:@options).long.must_equal('long')
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
describe "dry_run flag" do
|
296
|
+
it 'sets the `dry_run` var to true' do
|
297
|
+
vincent = Class.new(TestDiesel)
|
298
|
+
|
299
|
+
swallow_exit do
|
300
|
+
vincent.new(['--dry-run']).dry_run.must_equal(true)
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
describe "verbose flag" do
|
306
|
+
it 'sets the `verbose` var to true' do
|
307
|
+
swallow_exit do
|
308
|
+
TestDiesel.new(['--verbose']).verbose.must_equal(true)
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
it 'allows info messages to be printed' do
|
313
|
+
vincent = Class.new(TestDiesel) do
|
314
|
+
run do
|
315
|
+
info_message "An info message"
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
swallow_exit do
|
320
|
+
-> { vincent.new(['--verbose']).run }.must_output("** An info message\n")
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
it 'allows messages from `message` to be printed' do
|
325
|
+
vincent = Class.new(TestDiesel) do
|
326
|
+
run do
|
327
|
+
message "A message"
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
swallow_exit do
|
332
|
+
-> { vincent.new(['--verbose']).run }.must_output("A message\n")
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
describe "post_initialize" do
|
338
|
+
it 'runs before `run`' do
|
339
|
+
vincent = Class.new(TestDiesel) do
|
340
|
+
post_initialize do
|
341
|
+
message "post-initialize"
|
342
|
+
end
|
343
|
+
|
344
|
+
run do
|
345
|
+
message "run"
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
swallow_exit do
|
350
|
+
-> { vincent.new(['--verbose']).run }.must_output("post-initialize\nrun\n")
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
describe "message" do
|
356
|
+
it 'prints messages when verbose is true' do
|
357
|
+
vincent = Class.new(TestDiesel) do
|
358
|
+
run do
|
359
|
+
message "A message"
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
swallow_exit do
|
364
|
+
-> { vincent.new(['--verbose']).run }.must_output("A message\n")
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
368
|
+
it 'does not print messages when verbose is false' do
|
369
|
+
vincent = Class.new(TestDiesel) do
|
370
|
+
run do
|
371
|
+
message "A message"
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
output = capture_std_out do
|
376
|
+
swallow_exit { vincent.new([]).run }
|
377
|
+
end
|
378
|
+
|
379
|
+
output.to_s.wont_include("A message")
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
describe "info_message" do
|
384
|
+
it 'prepends messages with `**`' do
|
385
|
+
vincent = Class.new(TestDiesel) do
|
386
|
+
run do
|
387
|
+
info_message("An info message")
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
swallow_exit do
|
392
|
+
-> { vincent.new(['--verbose']).run }.must_output("** An info message\n")
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
it 'does not print messages when verbose is false' do
|
397
|
+
vincent = Class.new(TestDiesel) do
|
398
|
+
run do
|
399
|
+
info_message("An info message")
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
output = capture_std_out do
|
404
|
+
swallow_exit { vincent.new([]).run }
|
405
|
+
end
|
406
|
+
|
407
|
+
output.to_s.wont_include("** An info message")
|
408
|
+
end
|
409
|
+
|
410
|
+
it 'prints messages when verbose is true' do
|
411
|
+
vincent = Class.new(TestDiesel) do
|
412
|
+
run do
|
413
|
+
info_message "An info message"
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
417
|
+
swallow_exit do
|
418
|
+
-> { vincent.new(['--verbose']).run }.must_output("** An info message\n")
|
419
|
+
end
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
describe "error_message" do
|
424
|
+
it 'prepends messages with `!!`' do
|
425
|
+
vincent = Class.new(TestDiesel) do
|
426
|
+
run do
|
427
|
+
error_message("An error message")
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
swallow_exit do
|
432
|
+
-> { vincent.new(['--verbose']).run }.must_output("!! An error message\n")
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
it 'prints messages regardless of `verbose`' do
|
437
|
+
vincent = Class.new(TestDiesel) do
|
438
|
+
run do
|
439
|
+
error_message("An error message")
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
swallow_exit do
|
444
|
+
-> { vincent.new([]).run }.must_output("!! An error message\n")
|
445
|
+
end
|
446
|
+
end
|
447
|
+
end
|
448
|
+
|
449
|
+
describe "dry_run?" do
|
450
|
+
it 'returns true if the dry-run option is set' do
|
451
|
+
swallow_exit do
|
452
|
+
TestDiesel.new(['--dry-run']).dry_run?.must_equal(true)
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
it 'returns false if the dry-run option is not set' do
|
457
|
+
swallow_exit do
|
458
|
+
TestDiesel.new([]).dry_run?.must_equal(false)
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
data/test/test_diesel.rb
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require File.expand_path('../../lib/bin_diesel.rb', __FILE__)
|
3
|
+
require 'test_diesel'
|
4
|
+
require 'stringio'
|
5
|
+
require 'debugger'
|
6
|
+
|
7
|
+
def swallow_std_out
|
8
|
+
out = StringIO.new
|
9
|
+
$stdout = out
|
10
|
+
yield
|
11
|
+
ensure
|
12
|
+
$stdout = STDOUT
|
13
|
+
end
|
14
|
+
|
15
|
+
def capture_std_out
|
16
|
+
out = StringIO.new
|
17
|
+
$stdout = out
|
18
|
+
yield
|
19
|
+
ensure
|
20
|
+
$stdout = STDOUT
|
21
|
+
out
|
22
|
+
end
|
23
|
+
|
24
|
+
def swallow_exit
|
25
|
+
begin
|
26
|
+
yield
|
27
|
+
rescue SystemExit
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bin_diesel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew J Vargo
|
9
|
+
- Anthony White
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2014-09-03 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.3'
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ~>
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '1.3'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: rake
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :development
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: minitest
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: debugger
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
description: ! 'Bin Diesel allows you to write scripts relying on Option Parser with
|
80
|
+
DSL that eliminates the boiler plate code. Define options and run. '
|
81
|
+
email:
|
82
|
+
- avargo@dataxu.com
|
83
|
+
- awhite@dataxu.com
|
84
|
+
executables: []
|
85
|
+
extensions: []
|
86
|
+
extra_rdoc_files: []
|
87
|
+
files:
|
88
|
+
- .gitignore
|
89
|
+
- .travis.yml
|
90
|
+
- Examples/purge_files.rb
|
91
|
+
- Examples/test.rb
|
92
|
+
- Gemfile
|
93
|
+
- LICENSE.txt
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- bin_diesel.gemspec
|
97
|
+
- lib/bin_diesel.rb
|
98
|
+
- lib/bin_diesel/version.rb
|
99
|
+
- test/lib/bin_diesel/version_test.rb
|
100
|
+
- test/lib/bin_diesel_test.rb
|
101
|
+
- test/test_diesel.rb
|
102
|
+
- test/test_helper.rb
|
103
|
+
homepage: http://www.dataxu.com
|
104
|
+
licenses:
|
105
|
+
- New BSD License
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ! '>='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ! '>='
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
requirements: []
|
123
|
+
rubyforge_project:
|
124
|
+
rubygems_version: 1.8.23
|
125
|
+
signing_key:
|
126
|
+
specification_version: 3
|
127
|
+
summary: Easier "bin" scripts built with Option Parser.
|
128
|
+
test_files:
|
129
|
+
- test/lib/bin_diesel/version_test.rb
|
130
|
+
- test/lib/bin_diesel_test.rb
|
131
|
+
- test/test_diesel.rb
|
132
|
+
- test/test_helper.rb
|
133
|
+
has_rdoc:
|