SlideShare una empresa de Scribd logo
1 de 43
ru sh ,[object Object]
http://flickr.com/photos/exquisitur/2551255999/
What is ru sh ? ,[object Object],[object Object]
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= amp;quot; #{path} amp;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( /  Rushmate  / ) .../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( /  Rushmate  / ).mate
and Replace ,[object Object],[object Object],.../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  *(.*),  *(.*)  / ,  'User.authenticate(  2,   1)' ) User .authenticate(user, password) User .authenticate(password, user)
Processes ,[object Object],[object Object],[object Object],[object Object],[object Object],$ 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 ,[object Object],http://www.simpl try.com

Más contenido relacionado

La actualidad más candente

DevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung FooDevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung Foo
brian_dailey
 
CouchDB: A NoSQL database
CouchDB: A NoSQL databaseCouchDB: A NoSQL database
CouchDB: A NoSQL database
Rubyc Slides
 
Real-Time Python Web: Gevent and Socket.io
Real-Time Python Web: Gevent and Socket.ioReal-Time Python Web: Gevent and Socket.io
Real-Time Python Web: Gevent and Socket.io
Rick Copeland
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Tatsuhiko Miyagawa
 

La actualidad más candente (20)

DevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung FooDevChatt 2010 - *nix Cmd Line Kung Foo
DevChatt 2010 - *nix Cmd Line Kung Foo
 
Perl dancer
Perl dancerPerl dancer
Perl dancer
 
루비가 얼랭에 빠진 날
루비가 얼랭에 빠진 날루비가 얼랭에 빠진 날
루비가 얼랭에 빠진 날
 
Ansible leveraging 2.0
Ansible leveraging 2.0Ansible leveraging 2.0
Ansible leveraging 2.0
 
Node.js
Node.jsNode.js
Node.js
 
Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101
 
NYPHP March 2009 Presentation
NYPHP March 2009 PresentationNYPHP March 2009 Presentation
NYPHP March 2009 Presentation
 
node.js - Fast event based web application development
node.js - Fast event based web application developmentnode.js - Fast event based web application development
node.js - Fast event based web application development
 
Advanced JavaScript build pipelines using Gulp.js
Advanced JavaScript build pipelines using Gulp.jsAdvanced JavaScript build pipelines using Gulp.js
Advanced JavaScript build pipelines using Gulp.js
 
Lightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClientLightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClient
 
CouchApp - Build scalable web applications and relax
CouchApp - Build scalable web applications and relaxCouchApp - Build scalable web applications and relax
CouchApp - Build scalable web applications and relax
 
Lessons Learnt in 2009
Lessons Learnt in 2009Lessons Learnt in 2009
Lessons Learnt in 2009
 
JSON and the APInauts
JSON and the APInautsJSON and the APInauts
JSON and the APInauts
 
Plumbin Pipelines - A Gulp.js workshop
Plumbin Pipelines - A Gulp.js workshopPlumbin Pipelines - A Gulp.js workshop
Plumbin Pipelines - A Gulp.js workshop
 
CouchDB: A NoSQL database
CouchDB: A NoSQL databaseCouchDB: A NoSQL database
CouchDB: A NoSQL database
 
Real-Time Python Web: Gevent and Socket.io
Real-Time Python Web: Gevent and Socket.ioReal-Time Python Web: Gevent and Socket.io
Real-Time Python Web: Gevent and Socket.io
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
Web::Scraper
Web::ScraperWeb::Scraper
Web::Scraper
 
Bash in theory and in practice - part two
Bash in theory and in practice - part twoBash in theory and in practice - part two
Bash in theory and in practice - part two
 
Bash in theory and in practice - part one
Bash in theory and in practice - part oneBash in theory and in practice - part one
Bash in theory and in practice - part one
 

Similar a Rush, a shell that will yield to you

Integrating Flex And Rails With Ruby Amf
Integrating Flex And Rails With Ruby AmfIntegrating Flex And Rails With Ruby Amf
Integrating Flex And Rails With Ruby Amf
railsconf
 
Deploying Rails Applications with Capistrano
Deploying Rails Applications with CapistranoDeploying Rails Applications with Capistrano
Deploying Rails Applications with Capistrano
Almir Mendes
 
Unix shell scripting basics
Unix shell scripting basicsUnix shell scripting basics
Unix shell scripting basics
Abhay Sapru
 
Unix Shell Scripting Basics
Unix Shell Scripting BasicsUnix Shell Scripting Basics
Unix Shell Scripting Basics
Dr.Ravi
 
Python Deployment with Fabric
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabric
andymccurdy
 

Similar a Rush, a shell that will yield to you (20)

Integrating Flex And Rails With Ruby Amf
Integrating Flex And Rails With Ruby AmfIntegrating Flex And Rails With Ruby Amf
Integrating Flex And Rails With Ruby Amf
 
Flex With Rubyamf
Flex With RubyamfFlex With Rubyamf
Flex With Rubyamf
 
PHP 5 Sucks. PHP 5 Rocks.
PHP 5 Sucks. PHP 5 Rocks.PHP 5 Sucks. PHP 5 Rocks.
PHP 5 Sucks. PHP 5 Rocks.
 
Demystifying Maven
Demystifying MavenDemystifying Maven
Demystifying Maven
 
Deploy Rails Application by Capistrano
Deploy Rails Application by CapistranoDeploy Rails Application by Capistrano
Deploy Rails Application by Capistrano
 
Sinatra
SinatraSinatra
Sinatra
 
All I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web FrameworkAll I Need to Know I Learned by Writing My Own Web Framework
All I Need to Know I Learned by Writing My Own Web Framework
 
Deploying Rails Applications with Capistrano
Deploying Rails Applications with CapistranoDeploying Rails Applications with Capistrano
Deploying Rails Applications with Capistrano
 
Perl Dancer, FPW 2010
Perl Dancer, FPW 2010Perl Dancer, FPW 2010
Perl Dancer, FPW 2010
 
Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
 
Writing webapps with Perl Dancer
Writing webapps with Perl DancerWriting webapps with Perl Dancer
Writing webapps with Perl Dancer
 
URL Mapping, with and without mod_rewrite
URL Mapping, with and without mod_rewriteURL Mapping, with and without mod_rewrite
URL Mapping, with and without mod_rewrite
 
Unix shell scripting basics
Unix shell scripting basicsUnix shell scripting basics
Unix shell scripting basics
 
Unix Shell Scripting Basics
Unix Shell Scripting BasicsUnix Shell Scripting Basics
Unix Shell Scripting Basics
 
Python Deployment with Fabric
Python Deployment with FabricPython Deployment with Fabric
Python Deployment with Fabric
 
Nginx Workshop Aftermath
Nginx Workshop AftermathNginx Workshop Aftermath
Nginx Workshop Aftermath
 
Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!
 
Capistrano Overview
Capistrano OverviewCapistrano Overview
Capistrano Overview
 
Capistrano2
Capistrano2Capistrano2
Capistrano2
 

Último

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 

Rush, a shell that will yield to you

  • 1.
  • 3.
  • 4. Install and Run $ sudo gem install rush $ rush rush> home=> localhost:/Users/schlueter/
  • 5. No Working Directory $ home => localhost:/Users/schlueter $ root=> localhost://// $ rushmate = home[ &quot;mydev/github/rushmate/&quot; ] => localhost:/Users/schlueter/mydev/github/rushmate/
  • 6. But ls Still Works $ 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; ]
  • 9. Rename # assign a 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
  • 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 an Editor $ 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 an Array $ 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 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= amp;quot; #{path} amp;quot; >#{text}</a>&quot; } home[ &quot;rdoc.html&quot; ].write hrefs.join( &quot;<br />&quot; ) home.bash( &quot;open rdoc.html&quot; )
  • 23.  
  • 25. Search $ work[ &quot;**/*.rb&quot; ].search( / Rushmate / ) .../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( / Rushmate / ).mate
  • 26.
  • 27. Regex is your friend $ project_files.replace_contents! ( /User.authenticate *(.*), *(.*) / , 'User.authenticate( 2, 1)' ) User .authenticate(user, password) User .authenticate(password, user)
  • 28.
  • 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 if you must $ rushmate.bash &quot;rm -rf .&quot; # D'oh!
  • 32. Shell Locally Act Globally
  • 33. Remote $ remote = Rush :: Box . new ( 'user@server.com' ) $ remote[ &quot;/u/app/current/REVISION&quot; ].contents => 160
  • 34. Starts a Mongrel on Remote Server Use in production with caution
  • 35. 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
  • 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 # allows you 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 }
  • 43.