bini 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ Gemfile.lock
2
+ pkg/
3
+ tmp/
4
+ *.tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ bundler_args: --without development
2
+
3
+ rvm:
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - rbx-19mode
7
+
8
+ branches:
9
+ only:
10
+ - master
11
+ - development
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem "pry"
7
+ end
8
+
9
+ group :test do
10
+ gem "rspec"
11
+ gem "rake"
12
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Ernie Brodeur
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,71 @@
1
+ # Bini
2
+
3
+ A toolbox to help me rapidly build/deploy a cli. Filled with assumptions about how I think a CLI should behave.
4
+
5
+ #### Build Status
6
+ <table border="0">
7
+ <tr>
8
+ <td>master</td>
9
+ <td><a href=http://travis-ci.org/erniebrodeur/bini?branch=master><img src="https://secure.travis-ci.org/erniebrodeur/bini.png?branch=master"/></h> </td>
10
+ </tr>
11
+ <tr>
12
+ <td>development</td>
13
+ <td><a href=http://travis-ci.org/erniebrodeur/bini?branch=development><img src="https://secure.travis-ci.org/erniebrodeur/bini.png?branch=development"/></h> </td>
14
+ </tr>
15
+ </table>
16
+
17
+ ## Installation
18
+
19
+ To install:
20
+
21
+ % gem install bini
22
+
23
+ To use inside of an application, add this to the your gemfile:
24
+
25
+ % gem 'bini'
26
+
27
+ and run bundle to make it available:
28
+
29
+ % bundle
30
+
31
+ ## Usage
32
+
33
+ Bini is broken up into a few pieces, always include this first:
34
+
35
+ ```ruby
36
+ require 'bini'
37
+ ```
38
+
39
+ Optional components can be loaded like this:
40
+
41
+ ```ruby
42
+ require 'bini/config'
43
+ require 'bini/optparser'
44
+ require 'bini/log'
45
+ ```
46
+
47
+ ### API
48
+
49
+ Generated documentation is available via ```yard```.
50
+
51
+ Examples and wiki coming if they are ever needed.
52
+
53
+ ## Testing
54
+
55
+ In theory, testing is complete, in practice it's a work in progress.
56
+
57
+ ## Design philosophy
58
+
59
+ If such a thing can be said.
60
+
61
+ * Whenever possible, sane defaults will be supplied.
62
+ * A minimum amount of configuration before execution.
63
+ * If it requires a large chunk of requires, put it in a sub gem.
64
+ * Speed is of the utmost importance.
65
+ * Whenever possible, use stuff out of the stdlib.
66
+
67
+ ## Contributing
68
+
69
+ I don't have rules here, more guidelines.
70
+
71
+ * Try to make the branch name clear, words like feature/issue/bug help.
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require 'rspec/core/rake_task'
2
+
3
+ RSpec::Core::RakeTask.new(:spec)
4
+
5
+ task :default => :spec
6
+
7
+ require "bundler/gem_tasks"
data/bini.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bini/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "bini"
8
+ gem.version = Bini::VERSION
9
+ gem.authors = ["Ernie Brodeur"]
10
+ gem.email = ["ebrodeur@ujami.net"]
11
+ gem.description = "Bini needs no description."
12
+ gem.summary = "Bini is a gem that helps me build CLI tools. It's not thor, trollop, or any of the other major frameworks. It makes lots and lots of assumptions. It's probably not for you."
13
+ gem.homepage = "https://github.com/erniebrodeur/bini"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ gem.add_runtime_dependency "sys-proctable"
20
+ end
data/lib/bini.rb ADDED
@@ -0,0 +1,92 @@
1
+ require 'sys/proctable'
2
+
3
+ require "bini/sash"
4
+ require "bini/version"
5
+ require "bini/filemagic"
6
+
7
+ module Bini
8
+ extend self
9
+
10
+ attr_accessor :defaults
11
+
12
+ # I break this out so that I can use long name right away, this allows methods
13
+ # like configure to work.
14
+
15
+ @defaults = {}
16
+ @defaults[:long_name] = $0.split("/").last
17
+ @defaults[:cache_dir] = "#{Dir.home}/.cache/bini/#{@long_name}/"
18
+ @defaults[:config_dir] = "#{Dir.home}/.config/bini/#{@long_name}/"
19
+
20
+ # Dynamic attribute's based off the keys.
21
+ def keys
22
+ [:long_name, :cache_dir, :config_dir]
23
+ end
24
+
25
+ keys.each do |key|
26
+ define_method(key) do
27
+ v = instance_variable_get "@#{key}"
28
+ return @defaults[key] if !v
29
+ return v
30
+ end
31
+ define_method("#{key}=".to_sym) do |dir|
32
+ instance_variable_set "@#{key}", dir
33
+ end
34
+ end
35
+
36
+ def pids
37
+ a = Sys::ProcTable.ps.select{|x| x.cmdline =~ /.*#{@name}.*-[dD].*/}.map {|x| x.pid}
38
+ a.delete $$
39
+ return a if a.any?
40
+ nil
41
+ end
42
+
43
+
44
+ def daemonize(*params, &block)
45
+ if params[0] && !params[0][:multiple_pids] && pids
46
+ puts :info, "#{@name} appears to be running (#{pids}), only one allowed, exiting."
47
+ exit
48
+ end
49
+ puts :info, "Forking to background."
50
+
51
+ Process.daemon
52
+ block.call
53
+ end
54
+
55
+ def kill_daemon
56
+ if !pids
57
+ puts :fatal, "No pids found, exiting."
58
+ end
59
+
60
+ pids.each do |p|
61
+ puts :info, "Killing #{p}"
62
+ `kill -TERM #{p}`
63
+ end
64
+ end
65
+
66
+ # Adds a rails style configure method (@benwoody's unknown contribution)
67
+ def configure
68
+ yield self
69
+ parameters
70
+ end
71
+
72
+ # List available parameters and values in those params
73
+ def parameters
74
+ @values = {}
75
+ keys.each { |k| @values.merge! k => Bini.send(k) }
76
+ @values
77
+ end
78
+ alias_method :params, :parameters
79
+
80
+ # Returns true or false if all parameters are set.
81
+ def parameters?
82
+ parameters.values.all?
83
+ end
84
+
85
+ private
86
+
87
+ # Helper to clean up recursive method in #parameters
88
+ def get_var(var)
89
+ self.instance_variable_get(var)
90
+ end
91
+ end
92
+
@@ -0,0 +1,9 @@
1
+ require 'fileutils'
2
+
3
+ module Bini
4
+ attr_accessor :config
5
+
6
+ extend self
7
+
8
+ self.config = Sash.new file:"#{Bini.config_dir}/#{Bini.name}.yaml"
9
+ end
@@ -0,0 +1,15 @@
1
+ module Bini
2
+ module FileMagic
3
+ extend self
4
+
5
+ def mime_type(file)
6
+ return `file -bk --mime-type "#{file}"`.chomp! if File.exist? file
7
+ return nil
8
+ end
9
+
10
+ private
11
+ def filemagic_version
12
+ `file -v`.split(/^file-(.*)\nmagic file from (.*)\n/)[1]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class Array
2
+ def rand
3
+ self[Random.rand(self.count)]
4
+ end
5
+ end
@@ -0,0 +1,53 @@
1
+ require 'optparse'
2
+
3
+ module Bini
4
+ class OptionParser < ::OptionParser
5
+ def initialize
6
+ super
7
+ @options = {}
8
+
9
+ on("-V", "--version", "Print version") { |version| @options[:version] = true}
10
+ end
11
+
12
+ def parse!
13
+ super
14
+
15
+ if @options[:version]
16
+ if Bini.version
17
+ puts Bini.version
18
+ else
19
+ puts "No version supplied."
20
+ end
21
+ exit 0
22
+ end
23
+
24
+ mash Bini.config if Bini.config
25
+ end
26
+
27
+ # These are the hash like bits.
28
+
29
+ def clear
30
+ @options.clear
31
+ end
32
+
33
+ def [](k = nil)
34
+ return @options[k] if k
35
+ return @options if @options.any?
36
+ {}
37
+ end
38
+
39
+ def []=(k,v)
40
+ @options[k] = v
41
+ end
42
+
43
+ # merge takes in a set of values and overwrites the previous values.
44
+ # mash does this in reverse.
45
+ def mash(h)
46
+ h.merge! @options
47
+ @options.clear
48
+ h.each {|k,v| self[k] = v}
49
+ end
50
+ end
51
+ Options = OptionParser.new
52
+ end
53
+
data/lib/bini/sash.rb ADDED
@@ -0,0 +1,98 @@
1
+ require 'fileutils'
2
+ require 'yaml'
3
+
4
+ module Bini
5
+ # This is a savable hash, it can be configured and used to store whatever the# contents of the hash are for loading later. Will serialize in yaml to keep all
6
+ # the dependencies in ruby stdlib.
7
+ class Sash < Hash
8
+
9
+ attr_accessor :file
10
+ attr_accessor :backup
11
+ attr_accessor :mode
12
+ attr_accessor :auto_load
13
+ attr_accessor :auto_save
14
+
15
+
16
+
17
+ # initialization sets the values of the class Sash, not the contents of the Hash.
18
+ def initialize(params = {})
19
+ params.each { |k,v| instance_variable_set "@" + k.to_s,v}
20
+ load if @auto_load
21
+ end
22
+
23
+ # The base directory of the save file.
24
+ def basedir
25
+ return nil if !file
26
+ File.dirname File.absolute_path @file
27
+ end
28
+
29
+ # The save file plus an extension.
30
+ def backup_file
31
+ "#{@file}.bak"
32
+ end
33
+
34
+ # Save the hash to the file, check for backup and set_mode.
35
+ def save
36
+ if any?
37
+ FileUtils.mkdir_p basedir if !Dir.exist? basedir
38
+ backup if @backup
39
+
40
+ # I do this the long way because I want an immediate sync.
41
+ f = open(@file, 'w')
42
+ f.write YAML::dump self
43
+ f.sync
44
+ f.close
45
+
46
+ set_mode if @mode
47
+ end
48
+ true
49
+ end
50
+
51
+ def []=(key,value)
52
+ store key, value
53
+ save! if @auto_save == true
54
+ end
55
+ # Save the hash to a file, overwriting if necessary.
56
+ def save!
57
+ delete_file
58
+ save
59
+ end
60
+
61
+ # Load the save file into self.
62
+ def load
63
+ self.clear
64
+ if @file && File.exist?(@file) && File.stat(@file).size > 0
65
+ h = YAML::load open(@file, 'r').read
66
+ h.each { |k,v| self[k.to_sym] = v}
67
+ return true
68
+ end
69
+ false
70
+ end
71
+
72
+ # Generate a backup file real quick.
73
+ def backup
74
+ FileUtils.cp @file, backup_file if File.file? @file
75
+ end
76
+
77
+ # Set the mode of both the save file and backup file.
78
+ def set_mode
79
+ # Why are we trying to set_mode when we don't even have a file?
80
+ return false if !@file
81
+ File.chmod @mode, @file if File.exist? @file
82
+
83
+ # the backup file may not exist for whatever reason, lets not shit if it doesn't.
84
+ return true if !backup_file
85
+ File.chmod @mode, backup_file if File.exist? backup_file
86
+ true
87
+ end
88
+
89
+ private
90
+
91
+ # Delete the save file.
92
+ def delete_file
93
+ return false if !@file
94
+ FileUtils.rm @file if File.file? @file
95
+ return true
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,3 @@
1
+ module Bini
2
+ VERSION = "0.5.2"
3
+ end
data/spec/bini_spec.rb ADDED
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ # I'm not 100% sure convinvced any of these do what I think they do.
4
+ describe "Bini" do
5
+ before (:each) do
6
+ Bini.long_name = nil
7
+ @long_name = Bini.long_name
8
+ Bini.cache_dir = nil
9
+ @cache_dir = Bini.cache_dir
10
+ Bini.config_dir = nil
11
+ @config_dir = Bini.config_dir
12
+ end
13
+
14
+ # I can probably do this dynamically.
15
+ describe "long_name" do
16
+ it "can be reset" do
17
+ Bini.long_name = nil
18
+ Bini.long_name.should eq Bini.defaults[:long_name]
19
+ end
20
+
21
+ it "provides a default" do
22
+ Bini.long_name = nil
23
+ Bini.long_name.should_not be_nil
24
+ end
25
+
26
+ it "can be overridden" do
27
+ r = random_hex 4
28
+ Bini.long_name = r
29
+ Bini.long_name.should eq r
30
+ end
31
+
32
+ it "can be configured via .configure" do
33
+ r = random_hex 4
34
+ Bini.configure do |c|
35
+ c.long_name = r
36
+ end
37
+ Bini.long_name.should eq r
38
+ end
39
+ end
40
+
41
+ describe "cache_dir" do
42
+ it "can be reset" do
43
+ Bini.cache_dir = nil
44
+ Bini.cache_dir.should eq @cache_dir
45
+ end
46
+
47
+
48
+ it "provides a default" do
49
+ Bini.cache_dir = nil
50
+ Bini.cache_dir.should_not be_nil
51
+ end
52
+
53
+ it "can be overridden" do
54
+ r = random_hex 4
55
+ Bini.cache_dir = r
56
+ Bini.cache_dir.should eq r
57
+ end
58
+ it "can be configured via .configure" do
59
+ r = random_hex 4
60
+ Bini.configure do |c|
61
+ c.cache_dir = r
62
+ end
63
+ Bini.cache_dir.should eq r
64
+ end
65
+ end
66
+ describe "config_dir" do
67
+ it "can be reset" do
68
+ Bini.config_dir = nil
69
+ Bini.config_dir.should eq @config_dir
70
+ end
71
+
72
+
73
+ it "provides a default" do
74
+ Bini.config_dir = nil
75
+ Bini.config_dir.should_not be_nil
76
+ end
77
+
78
+ it "can be overridden" do
79
+ r = random_hex 4
80
+ Bini.config_dir = r
81
+ Bini.config_dir.should eq r
82
+ end
83
+ it "can be configured via .configure" do
84
+ r = random_hex 4
85
+ Bini.configure do |c|
86
+ c.config_dir = r
87
+ end
88
+ Bini.config_dir.should eq r
89
+ end
90
+ end
91
+ end
92
+
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Bini.config" do
4
+ it "is a hash." do
5
+ Bini.config.kind_of?(Hash).should be_true
6
+ end
7
+
8
+ it "which responds to save" do
9
+ Bini.config.respond_to?(:save).should be_true
10
+ end
11
+
12
+ it "which responds to load" do
13
+ Bini.config.respond_to?(:load).should be_true
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe "FileMagic" do
4
+ it "it will return a ruby mime type when targeting a ruby file." do
5
+ Bini::FileMagic.mime_type("./Rakefile").should eq "text/x-ruby"
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+ require 'bini/mixins'
3
+
4
+ describe "Array#random" do
5
+ it "will return a random entry from the array." do
6
+ a = [1, 2, 3]
7
+ a.include?(a.rand).should be_true
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe "optparser" do
4
+ before (:each) do
5
+ Options.clear
6
+ @key = random_hex 4
7
+ @value = random_hex 4
8
+ end
9
+
10
+ it "behaves like a OptionParser." do
11
+ Options.kind_of? OptionParser
12
+ end
13
+
14
+ describe "[Hash]" do
15
+ it "can clear" do
16
+ Options[:foo] = :bar
17
+ Options.clear
18
+ Options[].any?.should be_false
19
+ end
20
+
21
+ it "can set via []=" do
22
+ Options[@key] = @value
23
+ Options[@key].should eq @value
24
+ end
25
+
26
+ it "gets all keys with []" do
27
+ Options[@key] = @value
28
+ Options[].include?(@key).should be_true
29
+ end
30
+
31
+ it "gets a value with [:key]" do
32
+ Options[@key] = @value
33
+ Options[@key].should eq @value
34
+ end
35
+
36
+ it "can mash values (opposite of merge)." do
37
+ Options[:mash] = 'mush'
38
+ h = {mash:'notmush'}
39
+ Options.mash h
40
+ Options[:mash].should eq 'mush'
41
+ end
42
+
43
+ end
44
+ describe "parse" do
45
+ it "will attempt to mash in the Config[]#hash if available." do
46
+ Bini::config[@key] == @value
47
+ Options.parse!
48
+ Options[@key] = @value
49
+ end
50
+ end
51
+ end
data/spec/sash_spec.rb ADDED
@@ -0,0 +1,78 @@
1
+ require 'bini'
2
+
3
+ include Bini
4
+
5
+ describe "Sash" do
6
+ def random_file
7
+ "tmp/sash-#{(0...4).map{rand(16).to_s(16)}.join}.yaml"
8
+ end
9
+
10
+ before (:all) do
11
+ FileUtils.mkdir_p 'tmp'
12
+ end
13
+
14
+ before (:each) do
15
+ @filename = random_file
16
+ @s = Sash.new file:@filename
17
+ @s[:before_each] = true
18
+ end
19
+
20
+ after (:all) do
21
+ Dir.glob("tmp/sash-*.yaml*").each { |f| FileUtils.rm f}
22
+ end
23
+
24
+ it "can select the filename" do
25
+ @s.file.should be @filename
26
+ end
27
+
28
+ it "can save" do
29
+ @s[:foo] = :bar
30
+ @s.save
31
+ @s2 = Sash.new file:@filename
32
+ @s2.load
33
+ @s2[:foo].should eq :bar
34
+ end
35
+ it "can set the mode" do
36
+ @s.mode = 0600
37
+ @s.set_mode
38
+ @s.save
39
+ # I have no idea why you put in 0600, 0600 becomes 384, and out comes 33152.
40
+ # when I figure out where the conversion is going wrong, I'll update this.
41
+ File.stat(@s.file).mode.should eq 33152
42
+ end
43
+
44
+ it "can auto save" do
45
+ @s = Sash.new file:@filename, auto_save:true
46
+ @s[:auto_save] = true
47
+ @s2 = Sash.new file:@filename
48
+ @s2.load
49
+ @s2[:auto_save].should be true
50
+ end
51
+
52
+ it "can auto load" do
53
+ @s[:auto_load] = true
54
+ @s.save
55
+ @s2 = Sash.new file:@filename, auto_load:true
56
+ @s2[:auto_load].should be true
57
+ end
58
+
59
+ # We save twice because in order to produce a backup file, we need an original.
60
+ it "can make a backup file" do
61
+ @s.backup = true
62
+ @s[:backup] = "something"
63
+ @s.save
64
+ @s.save
65
+ File.exist?(@s.backup_file).should be_true
66
+ end
67
+
68
+ it "will behave like a normal Hash" do
69
+ @s.kind_of?(Hash).should be_true
70
+ end
71
+
72
+ it "will clear before load, destroying previous contents" do
73
+ @s[:clear] = 'clear'
74
+ @s.load
75
+ @s[:clear].should be_nil
76
+ end
77
+ end
78
+
@@ -0,0 +1,27 @@
1
+ require 'bini'
2
+ require 'bini/optparser'
3
+ require 'bini/config'
4
+
5
+ include Bini
6
+
7
+ # This file was generated by the `rspec --init` command. Conventionally, all
8
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
9
+ # Require this file using `require "spec_helper"` to ensure that it is only
10
+ # loaded once.
11
+ #
12
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
13
+ RSpec.configure do |config|
14
+ config.treat_symbols_as_metadata_keys_with_true_values = true
15
+ config.run_all_when_everything_filtered = true
16
+ config.filter_run :focus
17
+
18
+ # Run specs in random order to surface order dependencies. If you find an
19
+ # order dependency and want to debug it, you can fix the order by providing
20
+ # the seed, which is printed after each run.
21
+ # --seed 1234
22
+ config.order = 'random'
23
+ end
24
+
25
+ def random_hex(size)
26
+ (0...size).map{rand(16).to_s(16)}.join
27
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bini
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ernie Brodeur
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sys-proctable
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: Bini needs no description.
31
+ email:
32
+ - ebrodeur@ujami.net
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - .gitignore
38
+ - .rspec
39
+ - .travis.yml
40
+ - Gemfile
41
+ - LICENSE.txt
42
+ - README.md
43
+ - Rakefile
44
+ - bini.gemspec
45
+ - lib/bini.rb
46
+ - lib/bini/config.rb
47
+ - lib/bini/filemagic.rb
48
+ - lib/bini/mixins.rb
49
+ - lib/bini/optparser.rb
50
+ - lib/bini/sash.rb
51
+ - lib/bini/version.rb
52
+ - spec/bini_spec.rb
53
+ - spec/config_spec.rb
54
+ - spec/filemagic_spec.rb
55
+ - spec/mixins_spec.rb
56
+ - spec/optparser_spec.rb
57
+ - spec/sash_spec.rb
58
+ - spec/spec_helper.rb
59
+ homepage: https://github.com/erniebrodeur/bini
60
+ licenses: []
61
+ post_install_message:
62
+ rdoc_options: []
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ segments:
72
+ - 0
73
+ hash: -247432938325807426
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ segments:
81
+ - 0
82
+ hash: -247432938325807426
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 1.8.21
86
+ signing_key:
87
+ specification_version: 3
88
+ summary: Bini is a gem that helps me build CLI tools. It's not thor, trollop, or
89
+ any of the other major frameworks. It makes lots and lots of assumptions. It's
90
+ probably not for you.
91
+ test_files:
92
+ - spec/bini_spec.rb
93
+ - spec/config_spec.rb
94
+ - spec/filemagic_spec.rb
95
+ - spec/mixins_spec.rb
96
+ - spec/optparser_spec.rb
97
+ - spec/sash_spec.rb
98
+ - spec/spec_helper.rb