utility_belt 1.0.6 → 1.1.0
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/bin/amazon +4 -5
- data/bin/google +5 -16
- data/bin/pastie +6 -0
- data/lib/utility_belt.rb +13 -30
- data/lib/utility_belt/amazon_upload_shortcut.rb +25 -0
- data/lib/utility_belt/clipboard.rb +52 -0
- data/lib/{command_history.rb → utility_belt/command_history.rb} +20 -5
- data/lib/utility_belt/convertable_to_file.rb +34 -0
- data/lib/utility_belt/equipper.rb +72 -0
- data/lib/utility_belt/google.rb +33 -0
- data/lib/utility_belt/hash_math.rb +10 -0
- data/lib/utility_belt/interactive_editor.rb +78 -0
- data/lib/{irb_options.rb → utility_belt/irb_options.rb} +0 -0
- data/lib/{irb_verbosity_control.rb → utility_belt/irb_verbosity_control.rb} +0 -0
- data/lib/{is_an.rb → utility_belt/is_an.rb} +0 -0
- data/lib/{language_greps.rb → utility_belt/language_greps.rb} +0 -0
- data/lib/{not.rb → utility_belt/not.rb} +0 -0
- data/lib/utility_belt/pastie.rb +33 -0
- data/lib/utility_belt/pipe.rb +24 -0
- data/lib/utility_belt/prompt.rb +1 -0
- data/lib/{rails_finder_shortcut.rb → utility_belt/rails_finder_shortcut.rb} +0 -0
- data/lib/{rails_verbosity_control.rb → utility_belt/rails_verbosity_control.rb} +0 -0
- data/lib/{string_to_proc.rb → utility_belt/string_to_proc.rb} +0 -0
- data/lib/{symbol_to_proc.rb → utility_belt/symbol_to_proc.rb} +0 -0
- data/lib/{themes.rb → utility_belt/wirble.rb} +4 -0
- data/lib/{with.rb → utility_belt/with.rb} +0 -0
- data/spec/convertable_to_file_spec.rb +31 -0
- data/spec/equipper_spec.rb +70 -0
- data/spec/hash_math_spec.rb +32 -0
- data/spec/interactive_editor_spec.rb +146 -0
- data/{test → spec}/language_greps_spec.rb +3 -2
- data/spec/pastie_spec.rb +92 -0
- data/spec/pipe_spec.rb +30 -0
- data/spec/spec_helper.rb +8 -0
- data/{test → spec}/string_to_proc_spec.rb +2 -1
- data/{test → spec}/utility_belt_spec.rb +1 -0
- data/utility_belt.gemspec +5 -5
- metadata +42 -29
- data/Rakefile +0 -20
- data/lib/amazon_upload_shortcut.rb +0 -18
- data/lib/hash_math.rb +0 -13
- data/lib/interactive_editor.rb +0 -42
- data/lib/mac_clipboard.rb +0 -15
- data/lib/pastie.rb +0 -15
- data/test/hash_math_spec.rb +0 -16
data/bin/amazon
CHANGED
@@ -8,11 +8,10 @@ filenames = option_parser.parse(ARGV)
|
|
8
8
|
abort "Usage: amazon -b bucket_name file_name" unless @bucket && filenames
|
9
9
|
|
10
10
|
# require files, populate hash
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
UTILITY_BELT_IRB_STARTUP_PROCS[:define_s3_convenience_methods].call
|
11
|
+
require 'utility_belt'
|
12
|
+
UtilityBelt.equip(:amazon_upload_shortcut)
|
13
|
+
UtilityBelt.equip(:clipboard)
|
14
|
+
include UtilityBelt::AmazonUploadShortcut
|
16
15
|
|
17
16
|
# baddabing, baddaboom
|
18
17
|
filenames.each {|filename| puts aws_upload(@bucket, filename)}
|
data/bin/google
CHANGED
@@ -1,18 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
%w{rubygems platform
|
2
|
+
%w{rubygems platform net/http utility_belt}.each {|library| require library}
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
search_term = ARGV[0] || MacClipboard.read
|
9
|
-
if search_term.empty?
|
10
|
-
puts "Usage: google search_term_without_spaces"
|
11
|
-
puts " google 'search term with spaces'"
|
12
|
-
puts " google"
|
13
|
-
puts " (if invoking without command-line args, must have text in clipboard)"
|
14
|
-
puts " (if you're seeing this there's a good chance you copied an image or something)"
|
15
|
-
exit
|
16
|
-
end
|
17
|
-
system("open http://google.com/search?q=#{CGI.escape(search_term)}")
|
18
|
-
end
|
4
|
+
UtilityBelt.equip(:google)
|
5
|
+
include UtilityBelt::Google
|
6
|
+
|
7
|
+
google(ARGV[0])
|
data/bin/pastie
ADDED
data/lib/utility_belt.rb
CHANGED
@@ -3,37 +3,20 @@
|
|
3
3
|
# Check that file for usage information, authorship, copyright, and extensive details. You can also find a
|
4
4
|
# nice, HTMLified version of the README content at http://utilitybelt.rubyforge.org.
|
5
5
|
|
6
|
-
UTILITY_BELT_IRB_STARTUP_PROCS = {}
|
6
|
+
UTILITY_BELT_IRB_STARTUP_PROCS = {} unless Object.const_defined? :UTILITY_BELT_IRB_STARTUP_PROCS
|
7
7
|
|
8
|
-
%w{rubygems
|
9
|
-
platform
|
10
|
-
wirble
|
11
|
-
net/http
|
12
|
-
tempfile}.each {|library| require library}
|
13
|
-
%w{init colorize}.each {|message| Wirble.send(message)}
|
14
|
-
%w{mac_clipboard
|
15
|
-
is_an
|
16
|
-
pastie
|
17
|
-
themes
|
18
|
-
irb_verbosity_control
|
19
|
-
rails_verbosity_control
|
20
|
-
command_history
|
21
|
-
not
|
22
|
-
language_greps
|
23
|
-
rails_finder_shortcut
|
24
|
-
amazon_upload_shortcut
|
25
|
-
irb_options
|
26
|
-
interactive_editor
|
27
|
-
string_to_proc
|
28
|
-
symbol_to_proc
|
29
|
-
hash_math
|
30
|
-
with}.each {|internal_library| require internal_library}
|
8
|
+
%w{rubygems utility_belt/equipper}.each {|internal_library| require internal_library}
|
31
9
|
|
32
|
-
|
33
|
-
UtilityBelt::Themes.background(:dark)
|
10
|
+
if Object.const_defined? :IRB
|
34
11
|
|
35
|
-
# Called when the irb session is ready, after any external libraries have been loaded.
|
36
|
-
#
|
37
|
-
|
38
|
-
|
12
|
+
# Called when the irb session is ready, after any external libraries have been loaded. This
|
13
|
+
# allows the user to specify which gadgets in the utility belt to equip. (Kind of pushing the
|
14
|
+
# metaphor, but hey, what the hell.)
|
15
|
+
IRB.conf[:IRB_RC] = lambda do
|
16
|
+
UtilityBelt.equip(:defaults) unless UtilityBelt.equipped?
|
17
|
+
UTILITY_BELT_IRB_STARTUP_PROCS.each {|symbol, proc| proc.call}
|
18
|
+
end
|
19
|
+
|
20
|
+
# default: dark background
|
21
|
+
UtilityBelt::Themes.background(:dark) if defined? UtilityBelt::Themes
|
39
22
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# S3 (http://amazon.rubyforge.org/)
|
2
|
+
%w{aws/s3 cgi platform}.each {|lib| require lib}
|
3
|
+
|
4
|
+
module UtilityBelt
|
5
|
+
module AmazonUploadShortcut
|
6
|
+
def aws_upload(bucket,filename)
|
7
|
+
AWS::S3::Base.establish_connection!(:access_key_id => ENV['AMAZON_ACCESS_KEY_ID'],
|
8
|
+
:secret_access_key => ENV['AMAZON_SECRET_ACCESS_KEY'])
|
9
|
+
AWS::S3::S3Object.store(filename, open(filename), bucket, :access => :public_read)
|
10
|
+
url = "http://s3.amazonaws.com/#{bucket}/#{filename}".gsub(/ /, "%20")
|
11
|
+
Clipboard.write(url) if Clipboard.available?
|
12
|
+
url
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Object
|
18
|
+
include UtilityBelt::AmazonUploadShortcut
|
19
|
+
end if Object.const_defined? :IRB
|
20
|
+
|
21
|
+
# a quick note: the "google" command uses CGI.escape, but the URLs produced by CGI.escape
|
22
|
+
# don't seem to succeed here, in practice. this may differ by OS and/or browser. Let me
|
23
|
+
# know if you see something weird -- the Utility Belt mailing list is here:
|
24
|
+
#
|
25
|
+
# http://rubyforge.org/mailman/listinfo/utilitybelt-tinkering
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# original clipboard code: http://project.ioni.st/post/1334#snippet_1334
|
2
|
+
# turned it into a class to make it flexxy:
|
3
|
+
# http://gilesbowkett.blogspot.com/2007/09/improved-auto-pastie-irb-code.html
|
4
|
+
# Extended to handle windows and linux as well
|
5
|
+
require 'platform'
|
6
|
+
|
7
|
+
module UtilityBelt
|
8
|
+
class Clipboard
|
9
|
+
|
10
|
+
def self.available?
|
11
|
+
@@implemented || false
|
12
|
+
end
|
13
|
+
|
14
|
+
case Platform::IMPL
|
15
|
+
when :macosx
|
16
|
+
|
17
|
+
def self.read
|
18
|
+
IO.popen('pbpaste') {|clipboard| clipboard.read}
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.write(stuff)
|
22
|
+
IO.popen('pbcopy', 'w+') {|clipboard| clipboard.write(stuff)}
|
23
|
+
end
|
24
|
+
@@implemented = true
|
25
|
+
|
26
|
+
when :mswin
|
27
|
+
|
28
|
+
begin
|
29
|
+
# Try loading the win32-clipboard gem
|
30
|
+
require 'win32/clipboard'
|
31
|
+
|
32
|
+
def self.read
|
33
|
+
Win32::Clipboard.data
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.write(stuff)
|
37
|
+
Win32::Clipboard.set_data(stuff)
|
38
|
+
end
|
39
|
+
@@implemented = true
|
40
|
+
|
41
|
+
rescue LoadError
|
42
|
+
raise "You need the win32-clipboard gem for clipboard functionality!"
|
43
|
+
end
|
44
|
+
|
45
|
+
else
|
46
|
+
raise "No suitable clipboard implementation for your platform found!"
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
Clipboard = UtilityBelt::Clipboard if Object.const_defined? :IRB
|
@@ -23,6 +23,8 @@
|
|
23
23
|
# $Id: history.rb 50 2007-07-30 18:55:09Z ben $
|
24
24
|
#
|
25
25
|
|
26
|
+
require 'tempfile'
|
27
|
+
|
26
28
|
class Object
|
27
29
|
def history(how_many = 50)
|
28
30
|
history_size = Readline::HISTORY.size
|
@@ -54,15 +56,28 @@ class Object
|
|
54
56
|
end
|
55
57
|
file.close
|
56
58
|
end
|
59
|
+
|
60
|
+
# hack to handle JRuby bug
|
61
|
+
def handling_jruby_bug(&block)
|
62
|
+
if RUBY_PLATFORM =~ /java/
|
63
|
+
puts "JRuby IRB has a bug which prevents successful IRB vi interoperation."
|
64
|
+
puts "The JRuby team is aware of this and working on it."
|
65
|
+
puts "(http://jira.codehaus.org/browse/JRUBY-2049)"
|
66
|
+
else
|
67
|
+
yield
|
68
|
+
end
|
69
|
+
end
|
57
70
|
|
58
71
|
# TODO: history_write should go to a file, or the clipboard, or a file which opens in an application
|
59
72
|
def history_to_vi
|
60
|
-
|
61
|
-
|
62
|
-
|
73
|
+
handling_jruby_bug do
|
74
|
+
file = Tempfile.new("irb_tempfile")
|
75
|
+
get_lines(0..(Readline::HISTORY.size - 1)).each do |line|
|
76
|
+
file << "#{line}\n"
|
77
|
+
end
|
78
|
+
file.close
|
79
|
+
system("vim #{file.path}")
|
63
80
|
end
|
64
|
-
file.close
|
65
|
-
system("vim #{file.path}")
|
66
81
|
end
|
67
82
|
alias :hvi :history_to_vi
|
68
83
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
# This module adds a method, #to_file, which dumps the contents of self into a
|
4
|
+
# temp file and then returns the path of that file. This is particularly useful
|
5
|
+
# when calling out to shell commands which expect their input in the form of
|
6
|
+
# files.
|
7
|
+
#
|
8
|
+
# Example: use UNIX 'diff' to compare two objects:
|
9
|
+
#
|
10
|
+
# >> a = ["foo", "bar", "baz"].join("\n")
|
11
|
+
# => "foo\nbar\nbaz"
|
12
|
+
# >> b = ["foo", "buz", "baz"].join("\n")
|
13
|
+
# => "foo\nbuz\nbaz"
|
14
|
+
# >> puts `diff #{a.to_file} #{b.to_file}`
|
15
|
+
# 2c2
|
16
|
+
# < bar
|
17
|
+
# ---
|
18
|
+
# > buz
|
19
|
+
# => nil
|
20
|
+
#
|
21
|
+
module ConvertableToFile
|
22
|
+
def to_file
|
23
|
+
path = nil
|
24
|
+
Tempfile.open(object_id.to_s) do |tempfile|
|
25
|
+
tempfile << self
|
26
|
+
path = tempfile.path
|
27
|
+
end
|
28
|
+
path
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Object
|
33
|
+
include ConvertableToFile
|
34
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Allow to select which gadgets to equip
|
2
|
+
#
|
3
|
+
# Author: Markus Prinz <markus.prinz@qsig.org>
|
4
|
+
|
5
|
+
module UtilityBelt
|
6
|
+
class << self
|
7
|
+
def equip(*args)
|
8
|
+
Equipper.equip(*args)
|
9
|
+
end
|
10
|
+
def equipped?
|
11
|
+
Equipper.equipped?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
module Equipper
|
15
|
+
GADGETS = Dir[File.join(File.dirname(__FILE__), '*.rb')].map{|file| File.basename(file)[0..-4]}.reject{|gadget| "equipper" == gadget }
|
16
|
+
|
17
|
+
DEFAULTS = %w{wirble
|
18
|
+
hash_math
|
19
|
+
command_history
|
20
|
+
interactive_editor
|
21
|
+
irb_options
|
22
|
+
irb_verbosity_control}
|
23
|
+
|
24
|
+
@equipped = false
|
25
|
+
|
26
|
+
class << self
|
27
|
+
def equip(*args)
|
28
|
+
return if args.empty?
|
29
|
+
|
30
|
+
gadgets_to_equip = []
|
31
|
+
|
32
|
+
# Special case using :all or :none
|
33
|
+
if args[0].is_a?(Symbol) && [:all, :none, :defaults].include?(args[0])
|
34
|
+
what = args[0]
|
35
|
+
|
36
|
+
unless args[1].nil?
|
37
|
+
exceptions = args[1].has_key?(:except) ? args[1][:except] : []
|
38
|
+
|
39
|
+
# Handle special case where we get a string or a symbol instead of an array
|
40
|
+
exceptions = exceptions.to_s.to_a unless exceptions.is_a?( Array )
|
41
|
+
else
|
42
|
+
exceptions = []
|
43
|
+
end
|
44
|
+
|
45
|
+
case what
|
46
|
+
when :all
|
47
|
+
gadgets_to_equip.push(*(GADGETS - exceptions))
|
48
|
+
when :none
|
49
|
+
gadgets_to_equip.push(*exceptions)
|
50
|
+
when :defaults
|
51
|
+
gadgets_to_equip.push(*DEFAULTS)
|
52
|
+
end
|
53
|
+
# otherwise, args is a list of gadgets to equip
|
54
|
+
else
|
55
|
+
args.each do |arg|
|
56
|
+
gadget = arg.to_s
|
57
|
+
|
58
|
+
# Silently ignore unkown gadgets
|
59
|
+
gadgets_to_equip << gadget if GADGETS.include? gadget
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
gadgets_to_equip.each{|gadget| require "utility_belt/#{gadget}" }
|
64
|
+
|
65
|
+
@equipped ||= true
|
66
|
+
end
|
67
|
+
def equipped?
|
68
|
+
@equipped
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
%w{rubygems platform cgi}.each {|library| require library}
|
3
|
+
|
4
|
+
UtilityBelt.equip(:clipboard)
|
5
|
+
|
6
|
+
module UtilityBelt
|
7
|
+
module Google
|
8
|
+
def google(search_term = nil)
|
9
|
+
search_term ||= Clipboard.read if Clipboard.available?
|
10
|
+
if search_term.empty?
|
11
|
+
puts "Usage: google search_term_without_spaces (Unix command line only)"
|
12
|
+
puts " google 'search term with spaces' (Unix or IRB)"
|
13
|
+
puts " google (Unix or IRB)"
|
14
|
+
puts " (if invoking without args, must have text in clipboard)"
|
15
|
+
else
|
16
|
+
url = "http://google.com/search?q=#{CGI.escape(search_term)}"
|
17
|
+
case Platform::IMPL
|
18
|
+
when :macosx
|
19
|
+
Kernel.system("open #{url}")
|
20
|
+
when :windows
|
21
|
+
Kernel.system("start #{url}")
|
22
|
+
#when :linux
|
23
|
+
else
|
24
|
+
puts "Sorry, don't know how to open an URL from the command line on your platform"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class Object
|
32
|
+
include UtilityBelt::Google
|
33
|
+
end if Object.const_defined? :IRB
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# Giles Bowkett, Greg Brown, and several audience members from Giles' Ruby East presentation.
|
2
|
+
require 'tempfile'
|
3
|
+
class InteractiveEditor
|
4
|
+
DEBIAN_SENSIBLE_EDITOR = "/usr/bin/sensible-editor"
|
5
|
+
MACOSX_OPEN_CMD = "open"
|
6
|
+
XDG_OPEN = "/usr/bin/xdg-open"
|
7
|
+
|
8
|
+
def self.sensible_editor
|
9
|
+
return ENV["VISUAL"] if ENV["VISUAL"]
|
10
|
+
return ENV["EDITOR"] if ENV["EDITOR"]
|
11
|
+
return MACOSX_OPEN_CMD if Platform::IMPL == :macosx
|
12
|
+
if Platform::IMPL == :linux
|
13
|
+
if File.executable?(XDG_OPEN)
|
14
|
+
return XDG_OPEN
|
15
|
+
end
|
16
|
+
if File.executable?(DEBIAN_SENSIBLE_EDITOR)
|
17
|
+
return DEBIAN_SENSIBLE_EDITOR
|
18
|
+
end
|
19
|
+
end
|
20
|
+
raise "Could not determine what editor to use. Please specify."
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_accessor :editor
|
24
|
+
def initialize(editor = :vim)
|
25
|
+
@editor = editor.to_s
|
26
|
+
if @editor == "mate"
|
27
|
+
@editor = "mate -w"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
def edit_interactively
|
31
|
+
unless @file
|
32
|
+
@file = Tempfile.new("irb_tempfile")
|
33
|
+
end
|
34
|
+
system("#{@editor} #{@file.path}")
|
35
|
+
Object.class_eval(`cat #{@file.path}`)
|
36
|
+
rescue Exception => error
|
37
|
+
puts error
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module InteractiveEditing
|
42
|
+
def edit_interactively(editor = InteractiveEditor.sensible_editor)
|
43
|
+
unless IRB.conf[:interactive_editors] && IRB.conf[:interactive_editors][editor]
|
44
|
+
IRB.conf[:interactive_editors] ||= {}
|
45
|
+
IRB.conf[:interactive_editors][editor] = InteractiveEditor.new(editor)
|
46
|
+
end
|
47
|
+
IRB.conf[:interactive_editors][editor].edit_interactively
|
48
|
+
end
|
49
|
+
|
50
|
+
def handling_jruby_bug(&block)
|
51
|
+
if RUBY_PLATFORM =~ /java/
|
52
|
+
puts "JRuby IRB has a bug which prevents successful IRB vi/emacs editing."
|
53
|
+
puts "The JRuby team is aware of this and working on it."
|
54
|
+
puts "(http://jira.codehaus.org/browse/JRUBY-2049)"
|
55
|
+
else
|
56
|
+
yield
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def vi
|
61
|
+
handling_jruby_bug {edit_interactively(:vim)}
|
62
|
+
end
|
63
|
+
|
64
|
+
def mate
|
65
|
+
edit_interactively(:mate)
|
66
|
+
end
|
67
|
+
|
68
|
+
# TODO: Hardcore Emacs users use emacsclient or gnuclient to open documents in
|
69
|
+
# their existing sessions, rather than starting a brand new Emacs process.
|
70
|
+
def emacs
|
71
|
+
handling_jruby_bug {edit_interactively(:emacs)}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Since we only intend to use this from the IRB command line, I see no reason to
|
76
|
+
# extend the entire Object class with this module when we can just extend the
|
77
|
+
# IRB main object.
|
78
|
+
self.extend InteractiveEditing if Object.const_defined? :IRB
|