flyrb 1.0.0.a

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/History.txt +5 -0
  2. data/Manifest.txt +7 -0
  3. data/README +362 -0
  4. data/bin/amazon +16 -0
  5. data/bin/google +7 -0
  6. data/bin/pastie +7 -0
  7. data/flyrb.gemspec +22 -0
  8. data/html/andreas00.css +449 -0
  9. data/html/authorship.html +86 -0
  10. data/html/bg.gif +0 -0
  11. data/html/front.jpg +0 -0
  12. data/html/index.html +81 -0
  13. data/html/menubg.gif +0 -0
  14. data/html/menubg2.gif +0 -0
  15. data/html/test.jpg +0 -0
  16. data/html/usage.html +304 -0
  17. data/lib/flyrb/amazon_upload_shortcut.rb +25 -0
  18. data/lib/flyrb/clipboard.rb +52 -0
  19. data/lib/flyrb/command_history.rb +110 -0
  20. data/lib/flyrb/convertable_to_file.rb +34 -0
  21. data/lib/flyrb/equipper.rb +71 -0
  22. data/lib/flyrb/google.rb +33 -0
  23. data/lib/flyrb/hash_math.rb +13 -0
  24. data/lib/flyrb/interactive_editor.rb +78 -0
  25. data/lib/flyrb/irb_options.rb +3 -0
  26. data/lib/flyrb/irb_verbosity_control.rb +30 -0
  27. data/lib/flyrb/is_an.rb +4 -0
  28. data/lib/flyrb/language_greps.rb +28 -0
  29. data/lib/flyrb/not.rb +15 -0
  30. data/lib/flyrb/pastie.rb +34 -0
  31. data/lib/flyrb/pipe.rb +24 -0
  32. data/lib/flyrb/rails_finder_shortcut.rb +18 -0
  33. data/lib/flyrb/rails_verbosity_control.rb +8 -0
  34. data/lib/flyrb/string_to_proc.rb +72 -0
  35. data/lib/flyrb/symbol_to_proc.rb +30 -0
  36. data/lib/flyrb/wirble.rb +83 -0
  37. data/lib/flyrb/with.rb +21 -0
  38. data/lib/flyrb.rb +22 -0
  39. data/spec/convertable_to_file_spec.rb +31 -0
  40. data/spec/equipper_spec.rb +70 -0
  41. data/spec/flyrb_spec.rb +4 -0
  42. data/spec/hash_math_spec.rb +17 -0
  43. data/spec/interactive_editor_spec.rb +146 -0
  44. data/spec/language_greps_spec.rb +9 -0
  45. data/spec/pastie_spec.rb +92 -0
  46. data/spec/pipe_spec.rb +30 -0
  47. data/spec/spec_helper.rb +8 -0
  48. data/spec/string_to_proc_spec.rb +41 -0
  49. metadata +143 -0
@@ -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. But it might be unfixable."
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
@@ -0,0 +1,3 @@
1
+ # auto indent, _ special var
2
+ IRB.conf[:AUTO_INDENT] = true
3
+ IRB.conf[:EVAL_HISTORY] = 1000
@@ -0,0 +1,30 @@
1
+ # IRB verbosity: http://groups.google.com/group/ruby-talk-google/browse_thread/thread/9c1febbe05513dc0
2
+ module IRB
3
+ def self.result_format
4
+ conf[:PROMPT][conf[:PROMPT_MODE]][:RETURN]
5
+ end
6
+ def self.result_format=(str)
7
+ result_format.replace(str)
8
+ end
9
+ def self.show_results
10
+ self.result_format = "=> %s\n"
11
+ end
12
+ def self.hide_results
13
+ self.result_format = ''
14
+ end
15
+ end
16
+
17
+ class Object
18
+ def verbose
19
+ IRB.show_results
20
+ end
21
+ alias :v :verbose
22
+
23
+ def quiet
24
+ IRB.hide_results
25
+ end
26
+ alias :q :quiet
27
+
28
+ alias :x :exit
29
+ end
30
+
@@ -0,0 +1,4 @@
1
+ # is_a? Array bothers me
2
+ class Object
3
+ alias :is_an? :is_a?
4
+ end
@@ -0,0 +1,28 @@
1
+ # fix by Bob Hutchison:
2
+ class String
3
+ unless public_method_defined? :blank?
4
+ def blank?
5
+ self !~ /\S/
6
+ end
7
+ end
8
+ end
9
+
10
+ # TODO: upgrade these to take either regexes or strings
11
+
12
+ # http://gilesbowkett.blogspot.com/2006/12/smalltalk-cleverness-translated-into.html
13
+ # http://gilesbowkett.com/blog_code_samples/122906_seaside_rails/controller.txt
14
+ class Object
15
+ def grep_classes(search_term)
16
+ classes = []
17
+ ObjectSpace.each_object {|object| classes << object.name if object.is_a? Class and not object.name.blank?}
18
+ classes.find_all {|klass| klass.downcase.include? search_term.downcase}
19
+ end
20
+ end
21
+
22
+ # http://gilesbowkett.blogspot.com/2007/11/irb-what-was-that-method-again.html
23
+ class Object
24
+ def grep_methods(search_term)
25
+ methods.find_all {|method| method.downcase.include? search_term.downcase}
26
+ end
27
+ end
28
+
data/lib/flyrb/not.rb ADDED
@@ -0,0 +1,15 @@
1
+ # http://blog.jayfields.com/2007/08/ruby-adding-not-method-for-readability.html
2
+ class Object
3
+ define_method :not do
4
+ Not.new(self)
5
+ end
6
+ class Not
7
+ private *instance_methods.select { |m| m !~ /(^__|^\W|^binding$)/ }
8
+ def initialize(subject)
9
+ @subject = subject
10
+ end
11
+ def method_missing(sym, *args, &blk)
12
+ !@subject.send(sym,*args,&blk)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,34 @@
1
+ # automate creating pasties
2
+ %w{platform net/http flyrb}.each {|lib| require lib}
3
+ Flyrb.equip(:clipboard)
4
+
5
+ module Flyrb
6
+ module Pastie
7
+ def pastie(stuff_to_paste = nil)
8
+ stuff_to_paste ||= Clipboard.read if Clipboard.available?
9
+ # return nil unless stuff_to_paste
10
+
11
+ pastie_url = Net::HTTP.post_form(URI.parse("http://pastie.caboo.se/pastes/create"),
12
+ {"paste_parser" => "ruby",
13
+ "paste[authorization]" => "burger",
14
+ "paste[body]" => stuff_to_paste}).body.match(/href="([^\"]+)"/)[1]
15
+
16
+ Clipboard.write(pastie_url) if Clipboard.available?
17
+
18
+ case Platform::IMPL
19
+ when :macosx
20
+ Kernel.system("open #{pastie_url}")
21
+ when :mswin
22
+ pastie_url = pastie_url.chop if pastie_url[-1].chr == "\000"
23
+ Kernel.system("start #{pastie_url}")
24
+ end
25
+
26
+ return pastie_url
27
+ end
28
+ alias :pst :pastie
29
+ end
30
+ end
31
+
32
+ class Object
33
+ include Flyrb::Pastie
34
+ end if Object.const_defined? :IRB
data/lib/flyrb/pipe.rb ADDED
@@ -0,0 +1,24 @@
1
+ # This extension adds a UNIX-style pipe to strings
2
+ #
3
+ # Synopsis:
4
+ #
5
+ # >> puts "Flyrb is better than alfalfa" | "cowsay"
6
+ # ____________________________________
7
+ # < Flyrb is better than alfalfa >
8
+ # ------------------------------------
9
+ # \ ^__^
10
+ # \ (oo)\_______
11
+ # (__)\ )\/\
12
+ # ||----w |
13
+ # || ||
14
+ # => nil
15
+ #
16
+ class String
17
+ def |(cmd)
18
+ IO.popen(cmd, 'r+') do |pipe|
19
+ pipe.write(self)
20
+ pipe.close_write
21
+ pipe.read
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ # http://www.clarkware.com/cgi/blosxom/2007/09/03#ConsoleFindShortcut
2
+ # Mike Clark's find() shortcut for Rails console
3
+
4
+ # Creates shortcut methods for finding models.
5
+ FLYRB_IRB_STARTUP_PROCS[:define_model_find_shortcuts] = lambda do
6
+ if defined? ActiveRecord::Base || defined? ActiveResource::Base
7
+ model_files = Dir.glob("app/models/**/*.rb")
8
+ table_names = model_files.map { |f| File.basename(f).split('.')[0..-2].join }
9
+ table_names.each do |table_name|
10
+ Object.instance_eval do
11
+ define_method(table_name) do |*args|
12
+ table_name.camelize.constantize.send(:find, *args)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ # note: Mike wrote this for ARec, but it works on ARes too since it doesn't hit the DB
@@ -0,0 +1,8 @@
1
+ # Rails verbosity: http://weblog.jamisbuck.org/2007/1/8/watching-activerecord-do-it-s-thing
2
+ # Marcel said they toyed with making this the console default on core
3
+ class Object
4
+ def log
5
+ ActiveRecord::Base.clear_active_connections!
6
+ ActiveRecord::Base.logger = Logger.new(STDOUT)
7
+ end
8
+ end
@@ -0,0 +1,72 @@
1
+ # String#to_proc
2
+ #
3
+ # See http://weblog.raganwald.com/2007/10/stringtoproc.html
4
+ #
5
+ # Ported from the String Lambdas in Oliver Steele's Functional Javascript
6
+ # http://osteele.com/sources/javascript/functional/
7
+ #
8
+ # This work is licensed under the MIT License:
9
+ #
10
+ # (c) 2007 Reginald Braithwaite
11
+ # Portions Copyright (c) 2006 Oliver Steele
12
+ #
13
+ # Permission is hereby granted, free of charge, to any person obtaining
14
+ # a copy of this software and associated documentation files (the
15
+ # "Software"), to deal in the Software without restriction, including
16
+ # without limitation the rights to use, copy, modify, merge, publish,
17
+ # distribute, sublicense, and/or sell copies of the Software, and to
18
+ # permit persons to whom the Software is furnished to do so, subject to
19
+ # the following conditions:
20
+ #
21
+ # The above copyright notice and this permission notice shall be
22
+ # included in all copies or substantial portions of the Software.
23
+ #
24
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
+
32
+ class String
33
+ unless public_method_defined? :to_proc
34
+ def to_proc &block
35
+ params = []
36
+ expr = self
37
+ sections = expr.split(/\s*->\s*/m)
38
+ if sections.length > 1 then
39
+ eval_block(sections.reverse!.inject { |e, p| "(Proc.new { |#{p.split(/\s/).join(', ')}| #{e} })" }, block)
40
+ elsif expr.match(/\b_\b/)
41
+ eval_block("Proc.new { |_| #{expr} }", block)
42
+ else
43
+ leftSection = expr.match(/^\s*(?:[+*\/%&|\^\.=<>\[]|!=)/m)
44
+ rightSection = expr.match(/[+\-*\/%&|\^\.=<>!]\s*$/m)
45
+ if leftSection || rightSection then
46
+ if (leftSection) then
47
+ params.push('left')
48
+ expr = 'left' + expr
49
+ end
50
+ if (rightSection) then
51
+ params.push('right')
52
+ expr = expr + 'right'
53
+ end
54
+ else
55
+ self.gsub(
56
+ /(?:\b[A-Z]|\.[a-zA-Z_$])[a-zA-Z_$\d]*|[a-zA-Z_$][a-zA-Z_$\d]*:|self|arguments|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/, ''
57
+ ).scan(
58
+ /([a-z_$][a-z_$\d]*)/i
59
+ ) do |v|
60
+ params.push(v) unless params.include?(v)
61
+ end
62
+ end
63
+ eval_block("Proc.new { |#{params.join(', ')}| #{expr} }", block)
64
+ end
65
+ end
66
+ private
67
+ def eval_block(code, block)
68
+ eval code, block && block.binding
69
+ end
70
+ end
71
+ end
72
+
@@ -0,0 +1,30 @@
1
+ #--
2
+ # Copyright (c) 2005 David Heinemeier Hansson
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ class Symbol
25
+ unless public_method_defined? :to_proc
26
+ def to_proc
27
+ Proc.new { |*args| args.shift.__send__(self, *args) }
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,83 @@
1
+ require 'wirble'
2
+ Wirble.init
3
+ Wirble.colorize
4
+
5
+ module Flyrb
6
+ module Themes
7
+ def self.background(bkg)
8
+ case bkg
9
+ when :dark
10
+ Wirble::Colorize.colors = Flyrb::Themes::WIRBLE_DEFAULT_THEME
11
+ when :light
12
+ Wirble::Colorize.colors = Flyrb::Themes::THEME_FOR_WHITE_BKG
13
+ end
14
+ end
15
+ WIRBLE_DEFAULT_THEME = {
16
+ # delimiter colors
17
+ :comma => :blue,
18
+ :refers => :blue,
19
+
20
+ # container colors (hash and array)
21
+ :open_hash => :green,
22
+ :close_hash => :green,
23
+ :open_array => :green,
24
+ :close_array => :green,
25
+
26
+ # object colors
27
+ :open_object => :light_red,
28
+ :object_class => :white,
29
+ :object_addr_prefix => :blue,
30
+ :object_line_prefix => :blue,
31
+ :close_object => :light_red,
32
+
33
+ # symbol colors
34
+ :symbol => :yellow,
35
+ :symbol_prefix => :yellow,
36
+
37
+ # string colors
38
+ :open_string => :red,
39
+ :string => :cyan,
40
+ :close_string => :red,
41
+
42
+ # misc colors
43
+ :number => :cyan,
44
+ :keyword => :green,
45
+ :class => :light_green,
46
+ :range => :red,
47
+ }
48
+ THEME_FOR_WHITE_BKG = {
49
+ # delimiter colors
50
+ :comma => :purple,
51
+ :refers => :blue,
52
+
53
+ # container colors (hash and array)
54
+ :open_hash => :red,
55
+ :close_hash => :red,
56
+ :open_array => :red,
57
+ :close_array => :red,
58
+
59
+ # object colors
60
+ :open_object => :dark_gray,
61
+ :object_class => :purple,
62
+ :object_addr_prefix => :blue,
63
+ :object_line_prefix => :blue,
64
+ :close_object => :dark_gray,
65
+
66
+ # symbol colors
67
+ :symbol => :black,
68
+ :symbol_prefix => :light_gray,
69
+
70
+ # string colors
71
+ :open_string => :blue,
72
+ :string => :dark_gray,
73
+ :close_string => :blue,
74
+
75
+ # misc colors
76
+ :number => :black,
77
+ :keyword => :brown,
78
+ :class => :red,
79
+ :range => :blue,
80
+ }
81
+ COLORS = WIRBLE_DEFAULT_THEME
82
+ end
83
+ end
data/lib/flyrb/with.rb ADDED
@@ -0,0 +1,21 @@
1
+ # Object#with -- by Dan Yoder, dev.zeraweb.com -- this is something from Pascal
2
+ # and JavaScript. here's the use case.
3
+
4
+ # instead of:
5
+ # some_object.do_x
6
+ # some_object.do_y
7
+ # some_object.do_z
8
+ #
9
+ # you can instead do:
10
+ # with(some_object)
11
+ # do_x
12
+ # do_y
13
+ # do_z
14
+ # end
15
+
16
+ class Object
17
+ def with(object, &block)
18
+ object.instance_eval &block
19
+ end
20
+ end
21
+
data/lib/flyrb.rb ADDED
@@ -0,0 +1,22 @@
1
+ # This started as my (Giles Bowkett's) .irbrc file, turned into a recipe on IRB for the Pragmatic Programmers,
2
+ # and soon became a scrapbook of cool code snippets from all over the place. All the RDoc lives in the README.
3
+ # Check that file for usage information, authorship, copyright, and extensive details. You can also find a
4
+ # nice, HTMLified version of the README content at http://utilitybelt.rubyforge.org.
5
+
6
+ FLYRB_IRB_STARTUP_PROCS = {} unless Object.const_defined? :FLYRB_IRB_STARTUP_PROCS
7
+
8
+ %w{rubygems active_support flyrb/equipper}.each {|internal_library| require internal_library}
9
+
10
+ if Object.const_defined? :IRB
11
+
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] = Proc.new do
16
+ Flyrb.equip(:defaults) unless Flyrb.equipped?
17
+ FLYRB_IRB_STARTUP_PROCS.each {|symbol, proc| proc.call}
18
+ end
19
+
20
+ # default: dark background
21
+ Flyrb::Themes.background(:dark) if defined? Flyrb::Themes
22
+ end
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ require File.join(File.dirname(__FILE__), "spec_helper")
3
+
4
+ require 'spec'
5
+ require 'irb'
6
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'flyrb', 'convertable_to_file')
7
+
8
+ describe ConvertableToFile do
9
+ include ConvertableToFile
10
+
11
+ before :each do
12
+ @tempfile = stub("temp file", :<< => nil, :path => nil)
13
+ Tempfile.stub!(:open).and_yield(@tempfile)
14
+ end
15
+
16
+ it "should create a temp file using object id as basename" do
17
+ should_receive(:object_id).and_return(6789)
18
+ Tempfile.should_receive(:open).with("6789").and_yield(@tempfile)
19
+ to_file
20
+ end
21
+
22
+ it "should dump self to the opened temp file" do
23
+ @tempfile.should_receive(:<<).with(self)
24
+ to_file
25
+ end
26
+
27
+ it "should return the temp file path" do
28
+ @tempfile.should_receive(:path).and_return("TEMP_PATH")
29
+ to_file.should == "TEMP_PATH"
30
+ end
31
+ end
@@ -0,0 +1,70 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+ require 'lib/flyrb/equipper'
3
+
4
+ # Mocks for the gadgets
5
+ FLYRB_IRB_STARTUP_PROCS = {}
6
+
7
+ module IRB
8
+ def self.conf
9
+ {}
10
+ end
11
+ end
12
+
13
+ describe "Flyrb equipper" do
14
+
15
+ ALL_GADGETS = Flyrb::Equipper::GADGETS
16
+ DEFAULT_GADGETS = Flyrb::Equipper::DEFAULTS
17
+
18
+ before(:all) do
19
+ # I know, global variables are bad, but I can't get this to work otherwise
20
+ Kernel.__send__(:alias_method, :old_require, :require)
21
+ Kernel.__send__(:define_method, :require, proc {|library| $required_libs << library[6..-1] })
22
+ end
23
+
24
+ before(:each) do
25
+ $required_libs = []
26
+ end
27
+
28
+ after(:each) do
29
+ $required_libs = nil
30
+ end
31
+
32
+ after(:all) do
33
+ Kernel.__send__(:alias_method, :require, :old_require)
34
+ end
35
+
36
+ it "should load all gadgets" do
37
+ Flyrb.equip(:all)
38
+ $required_libs.should == ALL_GADGETS
39
+ end
40
+
41
+ it "should load no gadgets" do
42
+ Flyrb.equip(:none)
43
+ $required_libs.should == []
44
+ end
45
+
46
+ it "should load all default gadegts" do
47
+ Flyrb.equip(:defaults)
48
+ $required_libs.should == DEFAULT_GADGETS
49
+ end
50
+
51
+ it "should load all gadgets except is_an" do
52
+ Flyrb.equip(:all, :except => ['is_an'])
53
+ $required_libs.should == ALL_GADGETS - ['is_an']
54
+ end
55
+
56
+ it "should load no gadgets except is_an" do
57
+ Flyrb.equip(:none, :except => ['is_an'])
58
+ $required_libs.should == ['is_an']
59
+ end
60
+
61
+ it "should accept a string for the except-param" do
62
+ Flyrb.equip(:none, :except => 'is_an')
63
+ $required_libs.should == ['is_an']
64
+ end
65
+
66
+ it "should accept a symbol for the except-param" do
67
+ Flyrb.equip(:none, :except => :is_an)
68
+ $required_libs.should == ['is_an']
69
+ end
70
+ end
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+ # yeah, I know. I know! but you try to write specs for code which launches vi. most of this was
3
+ # already written by the time I started tasting the BDD Kool-Aid. HOWEVER! any new patches are
4
+ # very welcome, but MUST be accompanied by a spec or an absolutely airtight reason why not.
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), "spec_helper")
2
+ require "lib/flyrb/hash_math"
3
+ describe "Hash math" do
4
+
5
+ it "should add hashes" do
6
+ ({:a => :b} + {:c => :d}).should == {:a => :b, :c => :d}
7
+ end
8
+
9
+ it "should subtract hashes" do
10
+ ({:a => :b, :c => :d} - {:c => :d}).should == {:a => :b}
11
+ end
12
+
13
+ it "should subtract key/value pairs by key" do
14
+ ({:a => :b, :c => :d} - :c).should == {:a => :b}
15
+ end
16
+
17
+ end