command-line-favs 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6bd5d33d21e6787c2c179a69d1f9fc8eec6f210c
4
+ data.tar.gz: 1d56cca67075349dc1a2ae72255e4150ab39a099
5
+ SHA512:
6
+ metadata.gz: 0e4c8b52eae961faafdf53d09df3b6f27f29fd29ef81239844a55f8265eea051aea1ed053773838c228696da830b1af6884200e7325eea5f825b662109d572ab
7
+ data.tar.gz: a34a21249d9765193e709570dcbc48947881ccc075ba686493e245542ff1a874e360589d27f7ba182e11a8f09803cacb9a9327775674306e5b8eb7dd15b61591
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .DS_Store
2
+ results.html
3
+ pkg
4
+ html
5
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in command-line-favs.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,50 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ command-line-favs (0.0.1)
5
+ highline (~> 1.6)
6
+ methadone (~> 1.4)
7
+ parseconfig (~> 1.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ aruba (0.5.4)
13
+ childprocess (>= 0.3.6)
14
+ cucumber (>= 1.1.1)
15
+ rspec-expectations (>= 2.7.0)
16
+ builder (3.2.2)
17
+ childprocess (0.5.3)
18
+ ffi (~> 1.0, >= 1.0.11)
19
+ cucumber (1.3.14)
20
+ builder (>= 2.1.2)
21
+ diff-lcs (>= 1.1.3)
22
+ gherkin (~> 2.12)
23
+ multi_json (>= 1.7.5, < 2.0)
24
+ multi_test (>= 0.1.1)
25
+ diff-lcs (1.2.5)
26
+ ffi (1.9.3)
27
+ gherkin (2.12.2)
28
+ multi_json (~> 1.3)
29
+ highline (1.6.21)
30
+ json (1.8.1)
31
+ methadone (1.4.0)
32
+ bundler
33
+ multi_json (1.10.0)
34
+ multi_test (0.1.1)
35
+ parseconfig (1.0.4)
36
+ rake (0.9.6)
37
+ rdoc (4.1.1)
38
+ json (~> 1.4)
39
+ rspec-expectations (2.14.5)
40
+ diff-lcs (>= 1.1.3, < 2.0)
41
+
42
+ PLATFORMS
43
+ ruby
44
+
45
+ DEPENDENCIES
46
+ aruba (~> 0.5)
47
+ bundler (~> 1.6)
48
+ command-line-favs!
49
+ rake (~> 0.9)
50
+ rdoc (~> 4.1)
data/LICENSE.txt ADDED
@@ -0,0 +1,8 @@
1
+ Name: command-line-favs
2
+ Copyright (c) 2014 Jon Bake
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+
6
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,108 @@
1
+ # Command Line Favs
2
+
3
+ Command Line Favs is a CLI utility for organizing your commonly used shell commands. Commands are stored as a **Command Name** (think Alias) to **Command** map within your ~/.favs file and can be organized into groups.
4
+
5
+ A *~/.favs* file might look something like:
6
+
7
+ ```
8
+ #comments are supported so are un-grouped commands like this one
9
+ #positional-based substitution is also suported
10
+ pr = "echo $0"
11
+
12
+ #a group for all your ssh commands
13
+ [ssh]
14
+ google = "ssh -P 25001 jonmbake@74.125.225.224"
15
+ work = "ssh jbake@207.171.189.228"
16
+
17
+ [dev]
18
+ build = "mvn -Pdev -U clean install"
19
+ arq = "mvn -Parq-jbossas-remote clean verify -Pdev"
20
+
21
+ [Demo]
22
+ files_mod = "hg status | awk 'NR>2{print $2}' | xargs cat"
23
+ ```
24
+
25
+ You get the idea.
26
+
27
+ ## Getting help
28
+
29
+ A CLI utility is not complete without some decent help/documentation. Running *fav* with the *--help* flag will display all available options:
30
+
31
+ ```
32
+ $ fav --help
33
+ ```
34
+
35
+ The typically format for running a fav command is *fav [options] command_name*, where *options* usually contains an *Action* flag:
36
+
37
+ ## Fav a command
38
+
39
+ A command is added as a *Fav* by using the *-a* action flag. The following command will add a command as a *Fav*:
40
+
41
+ ```
42
+ $ fav -a 'echo I am a Test Command' tc
43
+ ```
44
+
45
+ Or to *Fav* a command to a group;
46
+
47
+ ```
48
+ $ fav -a 'echo I am a Test Command in a group' -g Demo tgc
49
+ ```
50
+
51
+ **In the event that the group does not yet exist when adding a *Fav* to group, the group will be automatically added.**
52
+
53
+ You can also always manually add a *Fav* by modifying your *~/.favs* file.
54
+
55
+ ### String Substitution
56
+
57
+ There is support for position string substitution; the syntax is '$<position>' (see the *pr* command in the examle .favs file).
58
+
59
+ ## Remove a Fav
60
+
61
+ A command is removed as a *Fav* by using the *-r* action flag. The following command will remove a command as a *Fav*:
62
+
63
+ ```
64
+ $ fav -r tc
65
+ ```
66
+
67
+ Or remove a group command:
68
+
69
+ ```
70
+ $ fav -r -g Demo files_mod
71
+ ```
72
+
73
+ You can also always manually remove a *Fav* by modifying your *~/.favs* file.
74
+
75
+ ## List Avaliable Favs
76
+
77
+ List favs within a group:
78
+
79
+ ```
80
+ fav -ls -g ssh
81
+ ```
82
+
83
+ List all commands:
84
+
85
+ ```
86
+ fav -ls -g
87
+ ```
88
+ ## Run a Fav
89
+
90
+ To run a *non-grouped* command:
91
+
92
+ ```
93
+ fav tc
94
+ ```
95
+
96
+ To run a *single* grouped command:
97
+
98
+ ```
99
+ $ fav -g TestGroup tgc
100
+ ```
101
+
102
+ Or run the *entire* group of commands:
103
+
104
+ ```
105
+ $ fav -g TestGroup --no_prompt
106
+ ```
107
+
108
+ When running an entire group of commands the default behavior is to prompt on each command. This can be overridden by supplying the *--no_prompt* flag.
data/README.rdoc ADDED
@@ -0,0 +1,23 @@
1
+ = command-line-favs - DESCRIBE YOUR GEM
2
+
3
+ Author:: YOUR NAME (YOUR EMAIL)
4
+ Copyright:: Copyright (c) 2014 YOUR NAME
5
+
6
+
7
+ License:: mit, see LICENSE.txt
8
+
9
+
10
+
11
+ DESCRIBE YOUR GEM HERE
12
+
13
+ == Links
14
+
15
+ * {Source on Github}[LINK TO GITHUB]
16
+ * RDoc[LINK TO RDOC.INFO]
17
+
18
+ == Install
19
+
20
+ == Examples
21
+
22
+ == Contributing
23
+
data/Rakefile ADDED
@@ -0,0 +1,61 @@
1
+ def dump_load_path
2
+ puts $LOAD_PATH.join("\n")
3
+ found = nil
4
+ $LOAD_PATH.each do |path|
5
+ if File.exists?(File.join(path,"rspec"))
6
+ puts "Found rspec in #{path}"
7
+ if File.exists?(File.join(path,"rspec","core"))
8
+ puts "Found core"
9
+ if File.exists?(File.join(path,"rspec","core","rake_task"))
10
+ puts "Found rake_task"
11
+ found = path
12
+ else
13
+ puts "!! no rake_task"
14
+ end
15
+ else
16
+ puts "!!! no core"
17
+ end
18
+ end
19
+ end
20
+ if found.nil?
21
+ puts "Didn't find rspec/core/rake_task anywhere"
22
+ else
23
+ puts "Found in #{path}"
24
+ end
25
+ end
26
+ require 'bundler'
27
+ require 'rake/clean'
28
+
29
+ require 'rake/testtask'
30
+
31
+ require 'cucumber'
32
+ require 'cucumber/rake/task'
33
+ gem 'rdoc' # we need the installed RDoc gem, not the system one
34
+ require 'rdoc/task'
35
+
36
+ include Rake::DSL
37
+
38
+ Bundler::GemHelper.install_tasks
39
+
40
+
41
+ Rake::TestTask.new do |t|
42
+ t.pattern = 'test/tc_*.rb'
43
+ end
44
+
45
+
46
+ CUKE_RESULTS = 'results.html'
47
+ CLEAN << CUKE_RESULTS
48
+ Cucumber::Rake::Task.new(:features) do |t|
49
+ t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format pretty --no-source -x"
50
+ t.fork = false
51
+ end
52
+
53
+ Rake::RDocTask.new do |rd|
54
+
55
+ rd.main = "README.rdoc"
56
+
57
+ rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
58
+ end
59
+
60
+ task :default => [:test,:features]
61
+
data/bin/fav ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'methadone'
5
+ require 'fav.rb'
6
+
7
+ class App
8
+ include Methadone::Main
9
+ include Methadone::CLILogging
10
+ include Methadone::SH
11
+
12
+ main do |command_name, *command_args|
13
+ cmd = Fav::CommandFactory.makeCommand(options, command_name, command_args)
14
+ cmd.run!
15
+ end
16
+
17
+ description "A utility for organizing your commonly used shell commands. Commands are stored in ~/.favs."
18
+
19
+ #Define flags
20
+ on("-a COMMAND_TEXT","--add", "Add a command to the list of favorites")
21
+ on("-ls", "--list", "List available commands")
22
+ on("-g GROUP_NAME","--group", "If used with -a flag, will add command to group. Otherwise will run command within group")
23
+ on("-r","--remove", "Remove a command from the list of favorites")
24
+ #
25
+ # Specify switches via:
26
+ on("--no_prompt", "Skip prompting when running a group of commands")
27
+ #
28
+ # Or, just call OptionParser methods on opts
29
+ #
30
+ # Require an argument
31
+ arg :command_name, "Name of command", :optional
32
+ #
33
+ # # Make an argument optional
34
+ # arg :optional_arg, :optional
35
+
36
+ version Fav::VERSION
37
+
38
+ @log_level = Logger::DEBUG
39
+ logger.level = Logger::DEBUG
40
+
41
+ go!
42
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fav/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "command-line-favs"
8
+ spec.version = Fav::VERSION
9
+ spec.authors = ["Jon Bake"]
10
+ spec.email = ["jmb@jonbake.com"]
11
+ spec.summary = %q{A CLI utility for organizing your commonly used shell commands.}
12
+ spec.description = %q{Commands are stored as a Command Name to Command map within your ~/.favs file and can be organized into groups. Stored commands can then be easily ran.}
13
+ spec.homepage = "https://github.com/jonmbake/command-line-favs"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
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.6"
22
+ spec.add_development_dependency('rdoc', '~> 4.1')
23
+ spec.add_development_dependency('aruba', '~> 0.5')
24
+ spec.add_development_dependency('rake', '~> 0.9')
25
+ spec.add_dependency('methadone', '~> 1.4')
26
+ spec.add_dependency('parseconfig', '~> 1.0')
27
+ spec.add_dependency('highline', '~> 1.6')
28
+ end
@@ -0,0 +1,138 @@
1
+ Feature: Run and save commands
2
+ In order to organize and run commonly-used commands
3
+ I want to save commands in an organized fashion
4
+ And to be able to invoke any saved command easily
5
+ So I don't have the hassle of creating a bunch of unorganized aliases
6
+
7
+ Scenario: Basic UI
8
+ When I get help for "fav"
9
+ Then the exit status should be 0
10
+ And the banner should be present
11
+ And there should be a one line summary of what the app does
12
+ And the banner should include the version
13
+ And the banner should document that this app takes options
14
+ And the banner should document that this app's arguments are:
15
+ |command_name|which is required|
16
+
17
+ Scenario: Add a Command
18
+ When I run `fav -a 'man cp' mc`
19
+ Then the ungrouped command "man cp" is added with name "mc"
20
+
21
+ Scenario: Add a Command to a Group
22
+ When I run `fav -a 'ls -l' -g TestGroup gr`
23
+ Then the command "ls -l" is added with name "gr" to the group "TestGroup"
24
+
25
+ Scenario: Remove an Ungrouped Command
26
+ Given a file named "/tmp/home/.favs" with:
27
+ """
28
+ ef = "echo Foo"
29
+ eb = "echo Bar"
30
+ """
31
+ When I run `fav -r ef`
32
+ Then the command with name "ef" no longer exists as a fav
33
+ And the ungrouped command "echo Bar" is added with name "eb"
34
+
35
+ Scenario: Remove a Grouped Command
36
+ Given a file named "/tmp/home/.favs" with:
37
+ """
38
+ [test]
39
+ ef = "echo Foo"
40
+ eb = "echo Bar"
41
+ """
42
+ When I run `fav -g test -r ef`
43
+ Then the command with name "ef" no longer exists as a fav in the group "test"
44
+ And the command "echo Bar" is added with name "eb" to the group "test"
45
+
46
+ Scenario: Run a Command
47
+ Given a file named "/tmp/home/.favs" with:
48
+ """
49
+ cpt = "touch /tmp/home/test.txt"
50
+ """
51
+ When I run `fav cpt`
52
+ Then the file "test.txt" exists in "/tmp/home"
53
+
54
+ Scenario: Run a Grouped Command
55
+ Given a file named "/tmp/home/.favs" with:
56
+ """
57
+ [test]
58
+ cpt = "touch /tmp/home/test2.txt"
59
+ """
60
+ When I run `fav -g test cpt`
61
+ Then the file "test2.txt" exists in "/tmp/home"
62
+
63
+ Scenario: Run an entire group of commands
64
+ Given a file named "/tmp/home/.favs" with:
65
+ """
66
+ [test]
67
+ cpt2 = "touch /tmp/home/test2.txt"
68
+ cpt = "touch /tmp/home/test.txt"
69
+ """
70
+ When I run `fav -g test --no_prompt`
71
+ Then the file "test2.txt" exists in "/tmp/home"
72
+ And the file "test.txt" exists in "/tmp/home"
73
+
74
+ Scenario: Run a command that prepends text to the end
75
+ Given a file named "/tmp/home/.favs" with:
76
+ """
77
+ e = "echo $0"
78
+ """
79
+ When I run `fav e 'foo'`
80
+ Then it should pass with:
81
+ """
82
+ foo
83
+ """
84
+
85
+ Scenario: Add a Command without a Command Name
86
+ When I run `fav -a 'echo I am a command'`
87
+ Then it should fail with:
88
+ """
89
+ Must specify command name when adding a fav.
90
+ """
91
+
92
+ Scenario: Remove a Command without a Command Name
93
+ When I run `fav -r`
94
+ Then it should fail with:
95
+ """
96
+ Must specify command name when removing a fav.
97
+ """
98
+
99
+ Scenario: Run a command for a group that doesn't exist
100
+ When I run `fav -g NotAGroup cmd`
101
+ Then it should fail with:
102
+ """
103
+ Specified group does not exist.
104
+ """
105
+
106
+ Scenario: List commands within a group
107
+ Given a file named "/tmp/home/.favs" with:
108
+ """
109
+ ug = "echo ungrouped"
110
+ [test]
111
+ ef = "echo Foo"
112
+ eb = "echo Bar"
113
+ """
114
+ When I run `fav -ls -g test`
115
+ Then it should pass with exactly:
116
+ """
117
+ ef = "echo Foo"
118
+ eb = "echo Bar"
119
+
120
+ """
121
+
122
+ Scenario: List all commands
123
+ Given a file named "/tmp/home/.favs" with:
124
+ """
125
+ ug = "echo ungrouped"
126
+ [test]
127
+ ef = "echo Foo"
128
+ eb = "echo Bar"
129
+ """
130
+ When I run `fav -ls`
131
+ Then it should pass with exactly:
132
+ """
133
+ ug = "echo ungrouped"
134
+ [test]
135
+ ef = "echo Foo"
136
+ eb = "echo Bar"
137
+
138
+ """
@@ -0,0 +1,25 @@
1
+ require 'parseconfig'
2
+
3
+ Then(/^the ungrouped command "(.*?)" is added with name "(.*?)"$/) do |command, name|
4
+ config = ParseConfig.new("#{ENV['HOME']}/.favs")
5
+ expect(config[name]).to eq(command)
6
+ end
7
+
8
+ Then(/^the command "(.*?)" is added with name "(.*?)" to the group "(.*?)"$/) do |command, name, group|
9
+ config = ParseConfig.new("#{ENV['HOME']}/.favs")
10
+ expect(config[group][name]).to eq(command)
11
+ end
12
+
13
+ Then(/^the file "(.*?)" exists in "(.*?)"$/) do |file_name, dir|
14
+ expect(File.exist?("#{dir}/#{file_name}")).to be true
15
+ end
16
+
17
+ Then(/^the command with name "(.*?)" no longer exists as a fav in the group "(.*?)"$/) do |name, group|
18
+ config = ParseConfig.new("#{ENV['HOME']}/.favs")
19
+ expect(config[group][name]).to be_nil
20
+ end
21
+
22
+ Then(/^the command with name "(.*?)" no longer exists as a fav$/) do |name|
23
+ config = ParseConfig.new("#{ENV['HOME']}/.favs")
24
+ expect(config[name]).to be_nil
25
+ end
@@ -0,0 +1,22 @@
1
+ require 'aruba/cucumber'
2
+ require 'methadone/cucumber'
3
+
4
+ ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
5
+ LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
6
+
7
+ Before do
8
+ # Using "announce" causes massive warnings on 1.9.2
9
+ @puts = true
10
+ @original_rubylib = ENV['RUBYLIB']
11
+ ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
12
+
13
+ @original_home = ENV['HOME']
14
+ ENV['HOME'] = "/tmp/home"
15
+ FileUtils.rm_rf "/tmp/home"
16
+ FileUtils.mkdir "/tmp/home"
17
+ end
18
+
19
+ After do
20
+ ENV['RUBYLIB'] = @original_rubylib
21
+ ENV['HOME'] = @original_home
22
+ end
@@ -0,0 +1,3 @@
1
+ module Fav
2
+ VERSION = "0.0.1"
3
+ end
data/lib/fav.rb ADDED
@@ -0,0 +1,179 @@
1
+ require "fav/version"
2
+ require 'methadone'
3
+ require 'parseconfig'
4
+ require "highline/import"
5
+
6
+ module Fav
7
+
8
+ # A Factory to Create Commands.
9
+ #
10
+ # The type of command that is created is based on the "action" cli option passed in;
11
+ # These include: Add (-a), Remove (-r), List (-ls). The default action is the Run Command.
12
+ class CommandFactory
13
+ # Static Factory Method
14
+ def self.makeCommand(cli_options, command_name, command_args)
15
+ if cli_options[:add]
16
+ command_name_check(command_name, 'adding')
17
+ AddCommand.new(cli_options, command_name, command_args, {bypass_group_check: true})
18
+ elsif cli_options[:remove]
19
+ command_name_check(command_name, 'removing')
20
+ RemoveCommand.new(cli_options, command_name, command_args)
21
+ elsif cli_options [:list]
22
+ ListCommand.new(cli_options, command_name, command_args)
23
+ else
24
+ RunCommand.new(cli_options, command_name, command_args)
25
+ end
26
+ end
27
+
28
+ # Checks that command name is given, if it is not raise an exception
29
+ def self.command_name_check(command_name, operation)
30
+ raise "Must specify command name when #{operation} a fav." unless command_name
31
+ end
32
+ end
33
+
34
+ # Base class for all commands
35
+ class FavCommand
36
+ include Methadone::CLILogging
37
+ include Methadone::SH
38
+
39
+ attr_reader :favs_file, :config, :cli_options, :command_name, :command_args, :command_options
40
+
41
+ def initialize(cli_options, command_name, command_args, command_options={})
42
+ @favs_file = "#{ENV['HOME']}/.favs"
43
+ # if ~/.favs file does not exist, create it
44
+ FileUtils.touch self.favs_file unless File.exist?(self.favs_file)
45
+
46
+ # parse ~/.favs
47
+ @config = ParseConfig.new(self.favs_file)
48
+
49
+ @cli_options = cli_options
50
+ @command_name = command_name
51
+ @command_args = command_args
52
+ @command_options = command_options
53
+ end
54
+
55
+ # Run the Command!
56
+ def run!
57
+ # specify callbacks for when the command is grouped or ungrouped
58
+ if self.cli_options[:group]
59
+ #raise error if group doesn't exist, unless bypass is specified
60
+ raise "Specified group does not exist." unless self.config[self.cli_options[:group]] || self.command_options[:bypass_group_check]
61
+ on_group(self.cli_options[:group])
62
+ else
63
+ on_non_group
64
+ end
65
+ post_group
66
+ end
67
+
68
+ # A hook called after the "grouping" method
69
+ def post_group
70
+ end
71
+ end
72
+
73
+ # Run a command specified as a Fav.
74
+ class RunCommand < FavCommand
75
+ # Run grouped command
76
+ def on_group(group)
77
+ # If we are running a grouped command, we must check if we are running the entire group or an individual command within a group.
78
+ if self.command_name
79
+ run_cmd self.config[group][self.command_name]
80
+ else
81
+ input = self.cli_options[:no_prompt] ? 'C' : 'N'
82
+ self.config[group].each do |key, value|
83
+ # don't re-prompt if they have chosen to continue
84
+ input = ask "Run command: #{value}? [(Y)es, (N)o, (C)ontinue, (B)reak]" unless input == 'C'
85
+ case input
86
+ when 'Y', 'C'
87
+ sh value
88
+ when 'B'
89
+ puts 'Breaking the execution of all remaining commands in group.'
90
+ break
91
+ else #'N' or some unrecognized option
92
+ puts "Skipping the execution of #{value}"
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ # Run non-grouped command
99
+ def on_non_group
100
+ run_cmd self.config[self.command_name]
101
+ end
102
+
103
+ private
104
+ def run_cmd(cmd)
105
+ unless cmd
106
+ error "Command does not exist"
107
+ return
108
+ end
109
+ cmd = cmd.gsub(/\$\d+/) do |d|
110
+ cmd_arg = command_args[d[1..-1].to_i]
111
+ error "Missing command argument at position #{d[1..-1]}" unless cmd_arg
112
+ cmd_arg
113
+ end
114
+ sh cmd
115
+ end
116
+ end
117
+
118
+ # A command to list commands
119
+ class ListCommand < FavCommand
120
+ # List commands in the group
121
+ def on_group(group)
122
+ self.config[group].each { |cmd_name, cmd_value| print_command(cmd_name, cmd_value) }
123
+ end
124
+
125
+ # List all commands
126
+ def on_non_group
127
+ file = File.open(self.favs_file, "rb")
128
+ puts file.read
129
+ end
130
+
131
+ private
132
+ # Print command name/value to console
133
+ def print_command(cmd_name, cmd_val)
134
+ puts "#{cmd_name} = \"#{cmd_val}\""
135
+ end
136
+ end
137
+
138
+ # A command that writes back to the Favs file
139
+ class WritableCommand < FavCommand
140
+ # Write the contents after performing the command
141
+ def post_group
142
+ file = File.open("#{ENV['HOME']}/.favs", 'w')
143
+ self.config.write(file)
144
+ file.close
145
+ end
146
+ end
147
+
148
+ # A command to add a Fav
149
+ class AddCommand < WritableCommand
150
+ # Add a grouped fav
151
+ def on_group(group)
152
+ self.config.add_to_group(group, self.command_name, self.cli_options[:add])
153
+ puts "Successfully added #{self.command_name} to the '#{group}' group!"
154
+ end
155
+
156
+ # Add a non-grouped fav
157
+ def on_non_group
158
+ self.config.add(self.command_name, self.cli_options[:add])
159
+ puts "Successfully added #{self.command_name}"
160
+ end
161
+ end
162
+
163
+ # A command to remove a fav
164
+ class RemoveCommand < WritableCommand
165
+ # Remove a grouped fav
166
+ def on_group(group)
167
+ #raise error if command they are attempting to remove doesn't exist
168
+ raise "Can not remove command because it doesn't exist" unless self.config[group][self.command_name]
169
+ self.config[group].delete(self.command_name)
170
+ puts "Successfully removed #{self.command_name} from the '#{group}' group!"
171
+ end
172
+
173
+ # Remove a non-grouped fav
174
+ def on_non_group
175
+ self.config.params.delete(self.command_name)
176
+ puts "Successfully removed #{self.command_name}"
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,7 @@
1
+ require 'test/unit'
2
+
3
+ class TestSomething < Test::Unit::TestCase
4
+ def test_truth
5
+ assert true
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: command-line-favs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jon Bake
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '4.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '4.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: aruba
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '0.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: methadone
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '1.4'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '1.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: parseconfig
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: highline
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '1.6'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '1.6'
111
+ description: Commands are stored as a Command Name to Command map within your ~/.favs
112
+ file and can be organized into groups. Stored commands can then be easily ran.
113
+ email:
114
+ - jmb@jonbake.com
115
+ executables:
116
+ - fav
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - .gitignore
121
+ - Gemfile
122
+ - Gemfile.lock
123
+ - LICENSE.txt
124
+ - README.md
125
+ - README.rdoc
126
+ - Rakefile
127
+ - bin/fav
128
+ - command-line-favs.gemspec
129
+ - features/command-line-favs.feature
130
+ - features/step_definitions/command-line-favs_steps.rb
131
+ - features/support/env.rb
132
+ - lib/fav.rb
133
+ - lib/fav/version.rb
134
+ - test/tc_something.rb
135
+ homepage: https://github.com/jonmbake/command-line-favs
136
+ licenses:
137
+ - MIT
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.2.2
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: A CLI utility for organizing your commonly used shell commands.
159
+ test_files:
160
+ - features/command-line-favs.feature
161
+ - features/step_definitions/command-line-favs_steps.rb
162
+ - features/support/env.rb
163
+ - test/tc_something.rb