bashy 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +3 -0
- data/README +3 -0
- data/Rakefile +45 -0
- data/bin/bashy +73 -0
- data/lib/bashy.rb +128 -0
- metadata +72 -0
data/LICENSE
ADDED
data/README
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#
|
2
|
+
# To change this template, choose Tools | Templates
|
3
|
+
# and open the template in the editor.
|
4
|
+
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
require 'rake'
|
8
|
+
require 'rake/clean'
|
9
|
+
require 'rake/gempackagetask'
|
10
|
+
require 'rake/rdoctask'
|
11
|
+
require 'rake/testtask'
|
12
|
+
|
13
|
+
spec = Gem::Specification.new do |s|
|
14
|
+
s.name = 'bashy'
|
15
|
+
s.version = '0.0.1'
|
16
|
+
s.has_rdoc = true
|
17
|
+
s.extra_rdoc_files = ['README', 'LICENSE']
|
18
|
+
s.summary = 'Your summary here'
|
19
|
+
s.description = s.summary
|
20
|
+
s.author = ''
|
21
|
+
s.email = ''
|
22
|
+
s.executables = ['bashy']
|
23
|
+
s.files = %w(LICENSE README Rakefile) + Dir.glob("{bin,lib,spec}/**/*")
|
24
|
+
s.require_path = "lib"
|
25
|
+
s.bindir = "bin"
|
26
|
+
end
|
27
|
+
|
28
|
+
Rake::GemPackageTask.new(spec) do |p|
|
29
|
+
p.gem_spec = spec
|
30
|
+
p.need_tar = true
|
31
|
+
p.need_zip = true
|
32
|
+
end
|
33
|
+
|
34
|
+
Rake::RDocTask.new do |rdoc|
|
35
|
+
files =['README', 'LICENSE', 'lib/**/*.rb']
|
36
|
+
rdoc.rdoc_files.add(files)
|
37
|
+
rdoc.main = "README" # page to start on
|
38
|
+
rdoc.title = "Bashy Docs"
|
39
|
+
rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
|
40
|
+
rdoc.options << '--line-numbers'
|
41
|
+
end
|
42
|
+
|
43
|
+
Rake::TestTask.new do |t|
|
44
|
+
t.test_files = FileList['test/**/*.rb']
|
45
|
+
end
|
data/bin/bashy
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), *%w[.. lib bashy])
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'highline/import'
|
7
|
+
|
8
|
+
STDOUT.sync = true
|
9
|
+
|
10
|
+
# This hash will hold all of our passed command line options.
|
11
|
+
options = {}
|
12
|
+
|
13
|
+
begin
|
14
|
+
raise ArgumentError.new('You need to specify a command to run.') unless ARGV.length > 0
|
15
|
+
|
16
|
+
options[:command] = ARGV[0]
|
17
|
+
# Translate the command aliases into real commands.
|
18
|
+
options[:command] = 'add' if ['a'].include?(options[:command])
|
19
|
+
options[:command] = 'list' if ['ls'].include?(options[:command])
|
20
|
+
options[:command] = 'remove' if ['rm'].include?(options[:command])
|
21
|
+
options[:command] = 'run' if ['r'].include?(options[:command])
|
22
|
+
options[:command] = 'show' if ['s'].include?(options[:command])
|
23
|
+
options[:command] = 'pull' if ['p'].include?(options[:command])
|
24
|
+
|
25
|
+
raise ArgumentError.new('You need to specify a valid command to run.') unless ['add', 'list', 'remove', 'run', 'show', 'pull'].include?(options[:command])
|
26
|
+
raise ArgumentError.new('You need to give this command a command name or path to work on.') unless ['list'].include?(options[:command]) || ARGV.length > 1
|
27
|
+
|
28
|
+
case options[:command]
|
29
|
+
when 'add'
|
30
|
+
options[:name] = ARGV[1]
|
31
|
+
options[:path] = ARGV[2]
|
32
|
+
when 'run'
|
33
|
+
options[:name] = ARGV[1]
|
34
|
+
options[:args] = ARGV[2..-1]
|
35
|
+
when 'show', 'pull'
|
36
|
+
options[:name] = ARGV[1]
|
37
|
+
when 'remove'
|
38
|
+
options[:names] = ARGV[1..-1]
|
39
|
+
end
|
40
|
+
|
41
|
+
case options[:command]
|
42
|
+
when 'add'
|
43
|
+
if options[:path].nil?
|
44
|
+
options[:snippet] = ask('Please enter the contents you want to have in this bashy snippet: ') { |q| q.default = nil }
|
45
|
+
end
|
46
|
+
Bashy::Add.new(options)
|
47
|
+
when 'list'
|
48
|
+
snippets = Bashy::List.new(options).snippets
|
49
|
+
puts (snippets.empty?) ? 'No snippets.' : snippets
|
50
|
+
when 'remove'
|
51
|
+
Bashy::Remove.new(options)
|
52
|
+
when 'run'
|
53
|
+
Bashy::Run.new(options)
|
54
|
+
when 'show'
|
55
|
+
puts Bashy::Show.new(options).contents
|
56
|
+
end
|
57
|
+
rescue Exception => e
|
58
|
+
# Show help.
|
59
|
+
puts e
|
60
|
+
puts ''
|
61
|
+
puts 'bashy: usage: bashy COMMAND [ARGS]'
|
62
|
+
puts ''
|
63
|
+
puts 'Commands'
|
64
|
+
puts ' add: Adds a snippet. You must provide a name. You can provide a path'
|
65
|
+
puts ' to a file to import, but if ommited you can enter your snippet'
|
66
|
+
puts ' into the STDIN'
|
67
|
+
puts ' list: Lists all added snippets.'
|
68
|
+
puts ' remove: Removes all snippets matching the names provided.'
|
69
|
+
puts ' run: Runs the given command, passing it any arguments given after'
|
70
|
+
puts ' the command name.'
|
71
|
+
puts ' show: Shows the contents of the given command file.'
|
72
|
+
puts ' help: Shows this help manual.'
|
73
|
+
end
|
data/lib/bashy.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'etc'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
module Bashy
|
7
|
+
# Our folder where we'll be storing our snippets and config.
|
8
|
+
SNIPPET_PATH = File.join(Etc.getpwuid.dir, '.bashy/snippets')
|
9
|
+
CONFIG_PATH = File.join(SNIPPET_PATH, 'bashy_config.yml')
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_accessor :config
|
13
|
+
|
14
|
+
def check_and_load_config_directory
|
15
|
+
# Check that our storage path is in tact and ready to write to.
|
16
|
+
FileUtils.mkdir_p(SNIPPET_PATH) unless File.exists?(SNIPPET_PATH)
|
17
|
+
# Now we'll create our config file if it doesn't exist.
|
18
|
+
unless File.exists?(CONFIG_PATH)
|
19
|
+
FileUtils.touch(CONFIG_PATH)
|
20
|
+
@config = default_config_file
|
21
|
+
save_config
|
22
|
+
else
|
23
|
+
# Setup our config object to be accessed everywhere.
|
24
|
+
File.open(CONFIG_PATH) do |yf|
|
25
|
+
@config = YAML::load(yf)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def save_config
|
31
|
+
File.open(CONFIG_PATH, 'w' ) do |out|
|
32
|
+
YAML.dump(@config, out)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def default_config_file
|
38
|
+
{ :snippets => [] }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class ArgumentError < RuntimeError; end
|
43
|
+
|
44
|
+
class Clean
|
45
|
+
def initialize(options = {})
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Add
|
51
|
+
def initialize(options = {})
|
52
|
+
# Check that our directories are in tact.
|
53
|
+
Bashy::check_and_load_config_directory
|
54
|
+
# If we haven't been passed the name of the bash snippet, raise an exception.
|
55
|
+
raise(ArgumentError) unless options.has_key?(:name)
|
56
|
+
# We're going to do different things here if we're operating on a path or the user wants to enter a snippet of code directly.
|
57
|
+
snippet_path = File.join(SNIPPET_PATH, options[:name])
|
58
|
+
if(!options[:path].nil?)
|
59
|
+
FileUtils.cp(options[:path], snippet_path)
|
60
|
+
else(options.has_key?(:snippet))
|
61
|
+
File.open(snippet_path, 'w') do |f|
|
62
|
+
f.write("#!/usr/bin/env bash\n") unless options[:snippet] =~ /^#!/
|
63
|
+
f.write(options[:snippet])
|
64
|
+
end
|
65
|
+
FileUtils.chmod(0777, snippet_path)
|
66
|
+
end
|
67
|
+
Bashy.config[:snippets] << options[:name]
|
68
|
+
Bashy.save_config
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class List
|
73
|
+
attr_reader :snippets
|
74
|
+
|
75
|
+
def initialize(options = {})
|
76
|
+
# Check that our directories are in tact.
|
77
|
+
Bashy::check_and_load_config_directory
|
78
|
+
# Set our class accessor for the snippets to the array of our snippets.
|
79
|
+
@snippets = Bashy.config[:snippets]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class Remove
|
84
|
+
def initialize(options = {})
|
85
|
+
# Check that our directories are in tact.
|
86
|
+
Bashy::check_and_load_config_directory
|
87
|
+
# Loop through passed names, and remove all that we can.
|
88
|
+
options[:names].each do |snippet|
|
89
|
+
if Bashy.config[:snippets].include?(snippet)
|
90
|
+
Bashy.config[:snippets].delete(snippet)
|
91
|
+
Bashy.save_config
|
92
|
+
FileUtils.rm(File.join(SNIPPET_PATH, snippet))
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Run
|
99
|
+
def initialize(options = {})
|
100
|
+
# Check that our directories are in tact.
|
101
|
+
Bashy::check_and_load_config_directory
|
102
|
+
unless options[:name].nil?
|
103
|
+
exec(File.join(SNIPPET_PATH, options[:name]), *options[:args])
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class Show
|
109
|
+
attr_reader :contents
|
110
|
+
|
111
|
+
def initialize(options = {})
|
112
|
+
# Check that our directories are in tact.
|
113
|
+
Bashy::check_and_load_config_directory
|
114
|
+
unless options[:name].nil?
|
115
|
+
File.open(File.join(SNIPPET_PATH, options[:name])) do |f|
|
116
|
+
@contents = f.readlines
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
class Pull
|
123
|
+
def initialize(options = {})
|
124
|
+
# Check that our directories are in tact.
|
125
|
+
Bashy::check_and_load_config_directory
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bashy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- ""
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-08-17 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Your summary here
|
23
|
+
email: ""
|
24
|
+
executables:
|
25
|
+
- bashy
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files:
|
29
|
+
- README
|
30
|
+
- LICENSE
|
31
|
+
files:
|
32
|
+
- LICENSE
|
33
|
+
- README
|
34
|
+
- Rakefile
|
35
|
+
- bin/bashy
|
36
|
+
- lib/bashy.rb
|
37
|
+
has_rdoc: true
|
38
|
+
homepage:
|
39
|
+
licenses: []
|
40
|
+
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
hash: 3
|
52
|
+
segments:
|
53
|
+
- 0
|
54
|
+
version: "0"
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
requirements: []
|
65
|
+
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 1.3.7
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: Your summary here
|
71
|
+
test_files: []
|
72
|
+
|