ru sh a shell that will  yield  to you
http://flickr.com/photos/exquisitur/2551255999/
What is ru sh ? Unix shell with ruby  syntax and idioms by Adam Wiggins (Heroku)
Install and Run $ sudo gem install rush $ rush rush> home=> localhost:/Users/schlueter/
No  Working Directory $ home => localhost:/Users/schlueter $ root=> localhost://// $  rushmate  =  home[ "mydev/github/rushmate/" ] => localhost:/Users/schlueter/mydev/github/rushmate/
But ls Still Works $ home[ "mydev/github/rushmate/" ].ls /Users/schlueter/mydev/github/rushmate/ coverage/ lib/ test/ History.txt MIT-LICENSE Manifest.txt
Make a Variable $  rushmate  =  home[ "mydev/github/rushmate/" ]
File Manipulation http://flickr.com/photos/takashi/18862634/
Rename # assign a file to a variable $ file  =  rushmate[ 'app/models/rushmate.rb' ] $ file.rename  'russian_mate.rb'
Duplicate a File $ file  =  rushmate[ 'README' ] $ file.duplicate  'README.markdown'
Copy Different Directory $ file  =  rushmate[ 'README' ] $ file.copy_to other_project[ 'README' ]
Move $ file  =  rushmate[ 'README' ] $ file.move_to home[ 'Desktop/' ]
Write a File $ file  =  rushmate[ 'README' ] $ file.write  "You Read Me"
Read a File $ rushmate[ "README" ].contents You Read Me
File Globbing
Basic Globbing $  rushmate[ "**/*.rb" ] .../mydev/github/rushmate/lib/rushmate.rb.../mydev/github/rushmate/lib/rushmate/command.rb.../mydev/github/rushmate/lib/rushmate/exit.rb ... =>  9  x  Rush :: File
Glob into an Editor $  rushmate[ "**/*.rb" ].vi $  rushmate[ "**/*.rb" ].mate
Operate on Results $ rails_proj[ '**/*.rhtml' ].each { | f |   f.rename f.name.gsub( / \. rhtml/ ,  '.html.erb' ) }
Results Are an Array $ rushmate[ "**/*.rb" ].reject {| f | f.name.match( /test.rb/ )} Go Nuts! $ rails_project[ "**/*.rhtml" ]  +  rails_project[ "**/*.html.erb" ]
embed http://flickr.com/photos/liamngls/413522957/ Rush :: EmbeddableShell . new .execute_in_shell  do   #anything in here delegates to rush end
Sake Quick Index of RDoc task  'rdoc:local'  =>  'rush'   do   shell  =   Rush :: EmbeddableShell . new   shell.execute_in_shell  do   end end ruby  =  root[ &quot;/Library/Ruby/Gems/1.8/&quot; ]   indexes  =  ruby[ &quot;doc/*/rdoc/index.html&quot; ]   hrefs  =  indexes.collect { | f |    path  =  f.full_path   text  =  path.match( /doc \/ (.*) \/ rdoc/ )[ 1 ]   &quot;<a href= \&quot; #{path} \&quot; >#{text}</a>&quot;     }   home[ &quot;rdoc.html&quot; ].write hrefs.join( &quot;<br />&quot; )   home.bash( &quot;open rdoc.html&quot; )
sake rdoc:local
 
Refactoring http://flickr.com/photos/tonyjcase/2262229518/
Search $ work[ &quot;**/*.rb&quot; ].search( / \b Rushmate \b / ) .../test/user_input_test.rb  => assert_equal(&quot;foo&quot;,  Rushmate ::.../lib/rushmate/command.rb  => module  Rushmate .../lib/rushmate/exit.rb  => module  Rushmate ...7 matching files with 25 matching lines $ work[ &quot;**/*.rb&quot; ].search( / \b Rushmate \b / ).mate
and Replace $ rushmate[ &quot;**/*.rb&quot; ].replace_contents! ( / \b Rushmate \b / ,  &quot;RussianMate&quot; ) .../lib/rushmate.rb.../lib/rushmate/command.rb.../lib/rushmate/exit.rb =>  9  x  Rush :: File
Regex is your friend $ project_files.replace_contents!  ( /User.authenticate \(\s *(.*), \s *(.*) \) / ,  'User.authenticate( \\ 2,  \\ 1)' ) User .authenticate(user, password) User .authenticate(password, user)
Processes ff.alive? ff.mem ff.pid ff.cpu ff.kill $ ff  =  processes.filter( :cmdline  =>  /firefox/ ).first
Real World Rush :: EmbeddableShell . new .execute_in_shell  do end ff_processes  =  processes. filter ( :cmdline  =>  /firefox/ )   if  ff  =  ff_processes.select{| p | p.mem  >   400000 }.first   ff_cmdline  =  ff.cmdline   ff.kill   home.bash ff_cmdline,  :background  =>  true   end
Permissions $ file.access  =   { :user_can  =>  :read_and_write ,    :group_and_other_can  =>  :read  } $ file.access[ :user_can_read ] => true
Use BASH if you must $ rushmate.bash  &quot;rm -rf .&quot; # D'oh!
Shell Locally Act Globally
Remote $  remote  =   Rush :: Box . new ( 'user@server.com' ) $  remote[ &quot;/u/app/current/REVISION&quot; ].contents => 160
Starts a Mongrel on Remote Server Use in production with caution
Customize # setup variables to common directories rushmate  =  home[ &quot;mydev/github/rushmate/&quot; ] # setup variables to common servers qa  =   Rush :: Box . new ( 'user@qa.local' ) ~/.rush/evn.rb
Cheap Backup def   cheap_backup (directory)   unless  directory.dir?   puts  &quot;cheap backup only works on dirs&quot;   return   end   backup_path  =  directory.path  +   &quot;/&quot;   +  directory.name  +   &quot;.bak&quot;   if   self [backup_path].exists?   puts  &quot;backup already exists&quot;   else   directory.duplicate(directory.name  +   &quot;.bak&quot; )   end end
Extend # allows you to run  # directory.coverage def   coverage   self .rake( &quot;coverage&quot; ) end ~/.rush/commands.rb
Another Command def   ruby_files   self [ &quot;**/*.rb&quot; ] end $ rushmate.ruby_files .../mydev/github/rushmate/lib/rushmate.rb.../mydev/github/rushmate/lib/rushmate/command.rb.../mydev/github/rushmate/lib/rushmate/exit.rb ... => 9 x Rush::File
 
TextMate Rushmate :: Command . new  {   # find ruby files with the current word in textmate   found_files  =  project_directory[ &quot;**/#{current_word.downcase}.rb&quot; ]   if  found_files.size  ==   1   found_files.mate   else   menu_files  =  found_files.collect    { | f | f.full_path.gsub(project_directory.full_path,  &quot;&quot; ) }   project_directory[user_input.quick_menu_from_array(menu_files)].mate   end }
The Take Away
Questions ?
Thank You schlueter @gmail.com http://www.simpl try.com

Rush, a shell that will yield to you

  • 1.
    ru sh ashell that will yield to you
  • 2.
  • 3.
    What is rush ? Unix shell with ruby syntax and idioms by Adam Wiggins (Heroku)
  • 4.
    Install and Run$ sudo gem install rush $ rush rush> home=> localhost:/Users/schlueter/
  • 5.
    No WorkingDirectory $ home => localhost:/Users/schlueter $ root=> localhost://// $ rushmate = home[ &quot;mydev/github/rushmate/&quot; ] => localhost:/Users/schlueter/mydev/github/rushmate/
  • 6.
    But ls StillWorks $ home[ &quot;mydev/github/rushmate/&quot; ].ls /Users/schlueter/mydev/github/rushmate/ coverage/ lib/ test/ History.txt MIT-LICENSE Manifest.txt
  • 7.
    Make a Variable$ rushmate = home[ &quot;mydev/github/rushmate/&quot; ]
  • 8.
  • 9.
    Rename # assigna file to a variable $ file = rushmate[ 'app/models/rushmate.rb' ] $ file.rename 'russian_mate.rb'
  • 10.
    Duplicate a File$ file = rushmate[ 'README' ] $ file.duplicate 'README.markdown'
  • 11.
    Copy Different Directory$ file = rushmate[ 'README' ] $ file.copy_to other_project[ 'README' ]
  • 12.
    Move $ file = rushmate[ 'README' ] $ file.move_to home[ 'Desktop/' ]
  • 13.
    Write a File$ file = rushmate[ 'README' ] $ file.write &quot;You Read Me&quot;
  • 14.
    Read a File$ rushmate[ &quot;README&quot; ].contents You Read Me
  • 15.
  • 16.
    Basic Globbing $ rushmate[ &quot;**/*.rb&quot; ] .../mydev/github/rushmate/lib/rushmate.rb.../mydev/github/rushmate/lib/rushmate/command.rb.../mydev/github/rushmate/lib/rushmate/exit.rb ... => 9 x Rush :: File
  • 17.
    Glob into anEditor $ rushmate[ &quot;**/*.rb&quot; ].vi $ rushmate[ &quot;**/*.rb&quot; ].mate
  • 18.
    Operate on Results$ rails_proj[ '**/*.rhtml' ].each { | f | f.rename f.name.gsub( / \. rhtml/ , '.html.erb' ) }
  • 19.
    Results Are anArray $ rushmate[ &quot;**/*.rb&quot; ].reject {| f | f.name.match( /test.rb/ )} Go Nuts! $ rails_project[ &quot;**/*.rhtml&quot; ] + rails_project[ &quot;**/*.html.erb&quot; ]
  • 20.
    embed http://flickr.com/photos/liamngls/413522957/ Rush:: EmbeddableShell . new .execute_in_shell do #anything in here delegates to rush end
  • 21.
    Sake Quick Indexof RDoc task 'rdoc:local' => 'rush' do shell = Rush :: EmbeddableShell . new shell.execute_in_shell do end end ruby = root[ &quot;/Library/Ruby/Gems/1.8/&quot; ] indexes = ruby[ &quot;doc/*/rdoc/index.html&quot; ] hrefs = indexes.collect { | f | path = f.full_path text = path.match( /doc \/ (.*) \/ rdoc/ )[ 1 ] &quot;<a href= \&quot; #{path} \&quot; >#{text}</a>&quot; } home[ &quot;rdoc.html&quot; ].write hrefs.join( &quot;<br />&quot; ) home.bash( &quot;open rdoc.html&quot; )
  • 22.
  • 23.
  • 24.
  • 25.
    Search $ work[&quot;**/*.rb&quot; ].search( / \b Rushmate \b / ) .../test/user_input_test.rb => assert_equal(&quot;foo&quot;, Rushmate ::.../lib/rushmate/command.rb => module Rushmate .../lib/rushmate/exit.rb => module Rushmate ...7 matching files with 25 matching lines $ work[ &quot;**/*.rb&quot; ].search( / \b Rushmate \b / ).mate
  • 26.
    and Replace $rushmate[ &quot;**/*.rb&quot; ].replace_contents! ( / \b Rushmate \b / , &quot;RussianMate&quot; ) .../lib/rushmate.rb.../lib/rushmate/command.rb.../lib/rushmate/exit.rb => 9 x Rush :: File
  • 27.
    Regex is yourfriend $ project_files.replace_contents! ( /User.authenticate \(\s *(.*), \s *(.*) \) / , 'User.authenticate( \\ 2, \\ 1)' ) User .authenticate(user, password) User .authenticate(password, user)
  • 28.
    Processes ff.alive? ff.memff.pid ff.cpu ff.kill $ ff = processes.filter( :cmdline => /firefox/ ).first
  • 29.
    Real World Rush:: EmbeddableShell . new .execute_in_shell do end ff_processes = processes. filter ( :cmdline => /firefox/ ) if ff = ff_processes.select{| p | p.mem > 400000 }.first ff_cmdline = ff.cmdline ff.kill home.bash ff_cmdline, :background => true end
  • 30.
    Permissions $ file.access = { :user_can => :read_and_write , :group_and_other_can => :read } $ file.access[ :user_can_read ] => true
  • 31.
    Use BASH ifyou must $ rushmate.bash &quot;rm -rf .&quot; # D'oh!
  • 32.
  • 33.
    Remote $ remote = Rush :: Box . new ( 'user@server.com' ) $ remote[ &quot;/u/app/current/REVISION&quot; ].contents => 160
  • 34.
    Starts a Mongrelon Remote Server Use in production with caution
  • 35.
    Customize # setupvariables to common directories rushmate = home[ &quot;mydev/github/rushmate/&quot; ] # setup variables to common servers qa = Rush :: Box . new ( 'user@qa.local' ) ~/.rush/evn.rb
  • 36.
    Cheap Backup def cheap_backup (directory) unless directory.dir? puts &quot;cheap backup only works on dirs&quot; return end backup_path = directory.path + &quot;/&quot; + directory.name + &quot;.bak&quot; if self [backup_path].exists? puts &quot;backup already exists&quot; else directory.duplicate(directory.name + &quot;.bak&quot; ) end end
  • 37.
    Extend # allowsyou to run # directory.coverage def coverage self .rake( &quot;coverage&quot; ) end ~/.rush/commands.rb
  • 38.
    Another Command def ruby_files self [ &quot;**/*.rb&quot; ] end $ rushmate.ruby_files .../mydev/github/rushmate/lib/rushmate.rb.../mydev/github/rushmate/lib/rushmate/command.rb.../mydev/github/rushmate/lib/rushmate/exit.rb ... => 9 x Rush::File
  • 39.
  • 40.
    TextMate Rushmate ::Command . new { # find ruby files with the current word in textmate found_files = project_directory[ &quot;**/#{current_word.downcase}.rb&quot; ] if found_files.size == 1 found_files.mate else menu_files = found_files.collect { | f | f.full_path.gsub(project_directory.full_path, &quot;&quot; ) } project_directory[user_input.quick_menu_from_array(menu_files)].mate end }
  • 41.
  • 42.
  • 43.
    Thank You schlueter@gmail.com http://www.simpl try.com