workon 0.0.13 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm use ruby-1.9.2-p136@workon
1
+ rvm use ruby-1.9.2-p290@workon
data/Guardfile ADDED
@@ -0,0 +1,14 @@
1
+ guard 'rspec', :version => 2, :cli => '-c -f doc', :notification => false, :all_after_pass => false do
2
+ watch(%r{^spec/.+_spec\.rb})
3
+ watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+
6
+ # Rails example
7
+ # watch('spec/spec_helper.rb') { "spec" }
8
+ # watch('config/routes.rb') { "spec/routing" }
9
+ # watch('app/controllers/application_controller.rb') { "spec/controllers" }
10
+ # watch(%r{^spec/.+_spec\.rb})
11
+ # watch(%r{^app/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
12
+ # watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
13
+ # watch(%r{^app/controllers/(.+)_(controller)\.rb}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
14
+ end
data/README.md ADDED
@@ -0,0 +1,27 @@
1
+ Workon
2
+ ======
3
+
4
+ A simple script to bootstrap your work day. It can:
5
+
6
+ - Launch your editor with the projects directory.
7
+ - Start a web server (Middleman, Passenger, Pow, Unicorn).
8
+ - Run Guard or Watchr.
9
+ - Display display commit history (currently only Git)
10
+ - Open your file manager with the projects directory
11
+ - Open the projects development page in your browser
12
+
13
+ $ workon -h
14
+ Usage: workon [options] project
15
+ -w, --without ACTORS Exclude unwanted actors
16
+ -o, --only ACTORS Only use certain actors
17
+ -d, --dump-configuration Dump workon configuration to project_path/.workonrc
18
+ --host HOST Ping this host
19
+ --port PORT Use this port for Middleman/Passenger
20
+ --server SERVER Use this server (auto,middleman,passenger,pow,unicorn)
21
+ --install-helper Install `wo' helper function to ~/.bash_profile
22
+ -P, --show-project Echo project's directory
23
+ -n, --dry-run Do not run any commands
24
+ -v, --version Show version information
25
+ -h, --help Show this help information
26
+
27
+ More to come ...
data/lib/workon.rb CHANGED
@@ -1,51 +1,47 @@
1
- $LOAD_PATH.unshift File.expand_path("../", __FILE__)
2
-
3
- require 'workon/configuration'
4
- require 'workon/actor'
5
- require "workon/version"
6
-
7
1
  module Workon
2
+ autoload :Configuration, 'workon/configuration'
3
+ # autoload :Actor, 'workon/actor'
4
+ autoload :VERSION, 'workon/version'
5
+
8
6
  WORK_DIRS = (ENV['WORKON_ROOT'] || ENV['HOME'] + '/Work') + '/*/*'
9
-
7
+
10
8
  def self.all_directories
11
9
  @_all_directories ||= Dir[WORK_DIRS]
12
10
  end
13
-
11
+
14
12
  def self.project_name
15
13
  config[:project]
16
14
  end
17
-
15
+
18
16
  def self.project_path
19
17
  @_path
20
18
  end
21
-
19
+
22
20
  def self.has_project?
23
21
  !project_name.nil? && 0 < project_name.to_s.length
24
22
  end
25
-
23
+
26
24
  def self.find_project(str = project_name)
27
25
  candidate = all_directories.find { |d| d.end_with? "/#{str}" }
28
-
26
+
29
27
  unless candidate.nil?
30
28
  @_path = candidate
31
29
  config.merge_project_rc
32
30
  end
33
31
  end
34
-
32
+
35
33
  def self.commit!
36
34
  Dir.chdir project_path
37
-
35
+
38
36
  Workon::Actor.ordered.each do |klass|
37
+ next if config[:without].include? klass.actor_name
39
38
  klass.new(project_path).commit
40
39
  end
41
40
  end
42
-
43
- def self.load_configuration(args)
44
- Workon::Configuration.instance.parse_options args
45
- end
46
-
41
+
47
42
  def self.config(args = [])
48
- load_configuration args unless args.empty?
49
- Workon::Configuration.instance
43
+ @config ||= Configuration.new args
50
44
  end
51
45
  end
46
+
47
+ require 'workon/actor'
data/lib/workon/actor.rb CHANGED
@@ -1,35 +1,35 @@
1
1
  module Workon
2
2
  module Actor
3
- include Enumerable
4
-
3
+ autoload :Helpers, 'workon/actor/helpers'
4
+
5
5
  def self.each(&block)
6
- Workon::Actor::Base.subclasses.each {|c| yield c }
6
+ Base.subclasses.each {|c| yield c }
7
7
  end
8
-
8
+
9
9
  def self.before(actor = nil, other = nil)
10
10
  @before ||= Hash.new { [] }
11
-
11
+
12
12
  return @before if actor.nil?
13
13
  raise ArgumentError if other.nil?
14
-
14
+
15
15
  @before[other] += [actor]
16
16
  end
17
-
17
+
18
18
  def self.ordered
19
- order ||= Workon::Actor::Base.subclasses.inject([]) do |memo, klass|
19
+ order ||= Base.subclasses.inject([]) do |memo, klass|
20
20
  other = encompass klass
21
- should_add = !Workon.config[:without].include?(klass.actor_name) && !memo.include?(klass)
22
-
21
+ should_add = !memo.include?(klass)
22
+
23
23
  should_add ? memo + other : memo
24
24
  end
25
-
25
+
26
26
  order
27
27
  end
28
-
28
+
29
29
  def self.encompass(klass)
30
30
  finder = klass.actor_name.to_sym
31
31
  _before = before[finder].map {|k| encompass k }
32
-
32
+
33
33
  (_before + [klass]).flatten
34
34
  end
35
35
  end
@@ -41,5 +41,8 @@ require 'workon/actor/web_browser'
41
41
  require 'workon/actor/finder'
42
42
  require 'workon/actor/git'
43
43
  require 'workon/actor/watchr'
44
- require 'workon/actor/passenger'
45
- require 'workon/actor/middleman'
44
+ # require 'workon/actor/passenger'
45
+ # require 'workon/actor/middleman'
46
+ # require 'workon/actor/unicorn'
47
+ require 'workon/actor/guard'
48
+ require 'workon/actor/server'
@@ -1,125 +1,57 @@
1
1
  module Workon
2
2
  module Actor
3
3
  class Base
4
+ include Workon::Actor::Helpers::Configurable
5
+ include Workon::Actor::Helpers::Commandable
6
+ include Workon::Actor::Helpers::Muxable
7
+ include Workon::Actor::Helpers::Bundler
8
+
4
9
  attr_reader :path
5
- attr_reader :project
6
-
10
+
7
11
  def self.inherited(base)
8
12
  @_subclasses ||= []
9
13
  @_subclasses << base
10
14
  end
11
-
12
- def self.option(*args, &block)
13
- Workon::Configuration.instance.parser.on(*args) do |v|
14
- block.call(v)
15
- end
16
- end
17
-
18
- def self.options
19
- Workon.config
20
- end
21
-
15
+
22
16
  def self.subclasses
23
17
  @_subclasses
24
18
  end
25
-
19
+
26
20
  def self.before(other = :all)
27
21
  Workon::Actor.before self, other
28
22
  end
29
-
23
+
30
24
  def self.actor_name
31
25
  name.split('::').last
32
26
  end
33
-
27
+
34
28
  def initialize(path)
35
29
  @path = path
36
30
  end
37
-
38
- def options
39
- self.class.options
40
- end
41
-
42
- def has_option?(key)
43
- options.exists? key
44
- end
45
-
46
- def fetch_option(key, default = nil)
47
- options.fetch key, default
48
- end
49
-
31
+
50
32
  def project
51
33
  @project ||= Workon.project_name
52
34
  end
53
-
35
+
54
36
  def commit
55
- run command unless command.nil? || command.empty?
56
- end
57
-
58
- def run(command)
59
- puts "Running #{command}"
60
- Kernel.system command unless options[:dry_run]
61
- end
62
-
63
- def has_command?(command)
64
- !`command -v '#{command}'`.empty?
65
- end
66
-
67
- def capture(command)
68
- puts "Running #{command}"
69
- output = %x(#{command}) unless options[:dry_run]
70
- return output
71
- end
72
-
73
- def bundle_command(command)
74
- project_uses_bundler? ? "bundle exec #{command}" : command
75
- end
76
-
77
- def project_uses_bundler?
78
- $project_uses_bundler ||= File.exists? './Gemfile'
79
- end
80
-
81
- def screen(command)
82
- $has_tmux ||= has_command? 'tmux'
83
-
84
- $has_tmux ? _tmux(command) : _screen(command)
85
- end
86
-
87
- def _screen(command, scope = nil)
88
- identifier = screen_scope scope
89
-
90
- run %(screen -dmS #{identifier} #{command})
91
- puts %(Reconnect with `screen -r #{identifier}')
92
- end
93
-
94
- def _tmux(command)
95
- initialize_tmux
96
-
97
- run "tmux attach-session -t #{tmux_session} \\; new-window -d -n #{tmux_window} '#{command}' \\; detach-client"
98
- end
99
-
100
- def initialize_tmux
101
- $tmux_initialized ||= begin
102
- run "tmux new-session -s #{tmux_session} \\; set-option -t #{tmux_session} set-remain-on-exit on \\; detach-client"
103
- true
104
- end
37
+ run command if !!command
105
38
  end
106
-
107
- def screen_scope(scope = nil)
108
- scope ||= self.class.actor_name
109
- "#{project}.#{scope}".downcase
39
+
40
+ def project_has_file?(file)
41
+ !Dir[path + "/#{file}"].empty?
110
42
  end
111
-
112
- def tmux_session
113
- project
43
+
44
+ def project_has_one_of?(*files)
45
+ files.any? { |f| project_has_file? f }
114
46
  end
115
-
116
- def tmux_window
117
- self.class.actor_name.downcase
47
+
48
+ def project_has_folder?(folder)
49
+ File.directory? path + "/#{folder}"
118
50
  end
119
-
51
+
120
52
  def open_with_default(thing)
121
53
  $open_command ||= has_command?('xdg-open') ? 'xdg-open' : 'open'
122
-
54
+
123
55
  "#{$open_command} #{thing}"
124
56
  end
125
57
  end
@@ -2,12 +2,11 @@ module Workon
2
2
  module Actor
3
3
  class Git < Base
4
4
  def project_uses_git?
5
- Dir.exists? %{#{path}/.git}
5
+ project_has_folder? '.git'
6
6
  end
7
-
8
- def commit
9
- output = %x(git log --oneline -n 10) if project_uses_git?
10
- puts output
7
+
8
+ def command
9
+ "git log --oneline -n 10" if project_uses_git?
11
10
  end
12
11
  end
13
12
  end
@@ -0,0 +1,15 @@
1
+ module Workon
2
+ module Actor
3
+ class Guard < Base
4
+ def command
5
+ screen bundle_command("guard --clear") if has_guardfile?
6
+ end
7
+
8
+ private
9
+ def has_guardfile?
10
+ project_has_file? 'Guardfile'
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,10 @@
1
+ module Workon
2
+ module Actor
3
+ module Helpers
4
+ autoload :Bundler, 'workon/actor/helpers/bundler'
5
+ autoload :Commandable, 'workon/actor/helpers/commandable'
6
+ autoload :Configurable, 'workon/actor/helpers/configurable'
7
+ autoload :Muxable, 'workon/actor/helpers/muxable'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Workon::Actor::Helpers::Bundler
2
+ def bundle_command(command)
3
+ project_uses_bundler? ? "bundle exec #{command}" : command
4
+ end
5
+
6
+ def project_uses_bundler?
7
+ $project_uses_bundler ||= File.exists? './Gemfile'
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module Workon::Actor::Helpers::Commandable
2
+ def run(command)
3
+ puts "Running #{command}" unless $TESTING
4
+ Kernel.system command unless options[:dry_run]
5
+ end
6
+
7
+ def has_command?(command)
8
+ !`command -v '#{command}'`.empty?
9
+ end
10
+
11
+ def capture(command)
12
+ puts "Running #{command}" unless $TESTING
13
+ output = %x(#{command}) unless options[:dry_run]
14
+ return output
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ module Workon::Actor::Helpers::Configurable
2
+ module ClassMethods
3
+ def option(*args, &block)
4
+ Workon.config.parser.on(*args) do |v|
5
+ block.call(v)
6
+ end
7
+ end
8
+
9
+ def options
10
+ Workon.config
11
+ end
12
+ end
13
+
14
+ module InstanceMethods
15
+ def options
16
+ self.class.options
17
+ end
18
+
19
+ def has_option?(key)
20
+ options.exists? key
21
+ end
22
+
23
+ def fetch_option(key, default = nil)
24
+ options.fetch key, default
25
+ end
26
+ end
27
+
28
+ def self.included(receiver)
29
+ receiver.extend ClassMethods
30
+ receiver.send :include, InstanceMethods
31
+ end
32
+ end
@@ -0,0 +1,45 @@
1
+ module Workon::Actor::Helpers::Muxable
2
+ def screen(command)
3
+ $has_tmux ||= has_command? 'tmux'
4
+ command = rvm_exec command
5
+
6
+ $has_tmux ? _tmux(command) : _screen(command)
7
+ end
8
+
9
+ def _screen(command, scope = nil)
10
+ identifier = screen_scope scope
11
+
12
+ run %(screen -dmS #{identifier} #{command})
13
+ puts %(Reconnect with `screen -r #{identifier}')
14
+ end
15
+
16
+ def _tmux(command)
17
+ initialize_tmux
18
+
19
+ run "tmux attach-session -t #{tmux_session} \\; new-window -d -n #{tmux_window} '#{command}' \\; detach-client"
20
+ end
21
+
22
+ def initialize_tmux
23
+ $tmux_initialized ||= begin
24
+ run "tmux new-session -s #{tmux_session} \\; set-option -t #{tmux_session} set-remain-on-exit on \\; detach-client"
25
+ true
26
+ end
27
+ end
28
+
29
+ def screen_scope(scope = nil)
30
+ scope ||= self.class.actor_name
31
+ "#{project}.#{scope}".downcase
32
+ end
33
+
34
+ def tmux_session
35
+ project
36
+ end
37
+
38
+ def tmux_window
39
+ self.class.actor_name.downcase
40
+ end
41
+
42
+ def rvm_exec(command)
43
+ Dir['./.rvmrc'].empty? ? command : "rvm --with-rubies default-with-rvmrc exec #{command}"
44
+ end
45
+ end
@@ -3,7 +3,7 @@ module Workon
3
3
  class Middleman < Base
4
4
  before :WebBrowser
5
5
  option('--middleman', 'Start mm-server') { |v| options[:middleman] = true }
6
-
6
+
7
7
  def commit
8
8
  if fetch_option :middleman, false
9
9
  port = fetch_option :port, 4567
@@ -2,15 +2,15 @@ module Workon
2
2
  module Actor
3
3
  class Passenger < Base
4
4
  before :WebBrowser
5
-
5
+
6
6
  def is_rack_app?
7
- !Dir['config.ru'].empty?
7
+ project_has_file? 'config.ru'
8
8
  end
9
-
9
+
10
10
  def passenger_standalone_available?
11
11
  has_command? 'passenger'
12
12
  end
13
-
13
+
14
14
  def commit
15
15
  if is_rack_app? && passenger_standalone_available?
16
16
  port = fetch_option :port, 3000
@@ -19,4 +19,4 @@ module Workon
19
19
  end
20
20
  end
21
21
  end
22
- end
22
+ end
@@ -0,0 +1,42 @@
1
+ module Workon
2
+ module Actor
3
+ class Server < Base
4
+ option('--server SERVER', 'Use this server (auto,middleman,passenger,pow,unicorn)') { |v| options[:server] = v}
5
+ before :WebBrowser
6
+
7
+ def commit
8
+ actual = fetch_option :server, 'auto'
9
+ valid = %w(auto middleman passenger pow unicorn)
10
+
11
+ return unless valid.include? actual
12
+ send :"commit_for_#{actual}"
13
+ end
14
+
15
+ private
16
+ def commit_for_auto
17
+ commit_for_unicorn and return if project_has_one_of?('unicorn.rb', 'config/unicorn.rb')
18
+ commit_for_passenger and return if project_has_file?('config.ru') && has_command?('passenger')
19
+ end
20
+
21
+ def commit_for_passenger
22
+ port = fetch_option :port, 3000
23
+ screen bundle_command("passenger start --port #{port}")
24
+ end
25
+
26
+ def commit_for_middleman
27
+ port = fetch_option :port, 4567
28
+ screen bundle_command("mm-server --port #{port}")
29
+ end
30
+
31
+ def commit_for_pow
32
+ options[:port] = nil
33
+ options[:host] = "#{project}.dev"
34
+ end
35
+
36
+ def commit_for_unicorn
37
+ port = fetch_option :port, 8080
38
+ screen bundle_command("unicorn_rails -c #{path}/config/unicorn.rb -l #{port}")
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,19 @@
1
+ module Workon
2
+ module Actor
3
+ class Unicorn < Base
4
+ before :WebBrowser
5
+
6
+ def has_unicorn_config?
7
+ project_has_file? 'config/unicorn.rb'
8
+ end
9
+
10
+ def commit
11
+ if has_unicorn_config?
12
+ port = fetch_option :port, 8080
13
+ screen bundle_command("unicorn_rails -c #{path}/config/unicorn.rb -l #{port}")
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
@@ -2,12 +2,12 @@ module Workon
2
2
  module Actor
3
3
  class Watchr < Base
4
4
  def watchr_file_exists?
5
- !Dir['*.watchr'].empty?
5
+ project_has_file? '*.watchr'
6
6
  end
7
-
8
- def commit
7
+
8
+ def command
9
9
  screen "watchr" if watchr_file_exists?
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -3,22 +3,22 @@ module Workon
3
3
  class WebBrowser < Base
4
4
  option('--host HOST', 'Ping this host') { |v| options[:host] = v}
5
5
  option('--port PORT', Integer, 'Use this port for Middleman/Passenger') { |v| options[:port] = v}
6
-
6
+
7
7
  def command
8
8
  host_name = fetch_option :host, %{#{project}.local}
9
9
  port_number = fetch_option :port, nil
10
-
10
+
11
11
  command, qualified = port_number.nil? ? ping_test(host_name) : netstat_test(port_number)
12
12
  opener = open_with_default "http://#{qualified}"
13
13
  %(#{command} && #{opener})
14
14
  end
15
-
15
+
16
16
  private
17
17
  def ping_test(host_name)
18
18
  command = %{ping -q -c 1 -t 1 #{host_name}}
19
19
  [ command, host_name ]
20
20
  end
21
-
21
+
22
22
  def netstat_test(port)
23
23
  command = %{sleep 3 && netstat -na | egrep 'tcp4*6* +([0-9]+ +){2}(\\*|([0-9]+\\.)+[0-9]+)(:|\\.)#{port}'}
24
24
  [ command, "localhost:#{port}" ]
data/lib/workon/cli.rb CHANGED
@@ -1,35 +1,43 @@
1
1
  require 'workon'
2
- require 'workon/cli/commands'
3
2
 
4
3
  module Workon
5
4
  module CLI
5
+ autoload :Commands, 'workon/cli/commands'
6
+
7
+ def self.show_help
8
+ puts @config.parser
9
+ exit
10
+ end
11
+
12
+ def self.install_helper
13
+ Commands::InstallHelper.execute
14
+ exit
15
+ end
16
+
17
+ def self.show_project
18
+ puts Workon.project_path
19
+ exit
20
+ end
21
+
22
+ def self.dump_configuration
23
+ @config.dump_to_project_rc
24
+ exit
25
+ end
26
+
6
27
  def self.execute
7
- config = Workon.config ARGV
8
-
9
- if config[:show_help]
10
- puts Workon::Configuration.instance.parser
11
- exit
12
- end
13
-
14
- if config[:install_helper]
15
- Workon::CLI::Commands::InstallHelper.execute
16
- exit
17
- end
18
-
28
+ Workon.config.merge_options ARGV
29
+ @config = Workon.config
30
+
31
+ show_help if @config[:show_help]
32
+ install_helper if @config[:install_helper]
33
+
19
34
  raise OptionParser::MissingArgument unless Workon.has_project?
20
-
35
+
21
36
  Workon.find_project
22
-
23
- if config[:show_project]
24
- puts Workon.project_path
25
- exit
26
- end
27
-
28
- if config[:dump_configuration]
29
- Workon::Configuration.instance.dump_to_project_rc
30
- exit
31
- end
32
-
37
+
38
+ show_project if @config[:show_project]
39
+ dump_configuration if @config[:dump_configuration]
40
+
33
41
  Workon.commit!
34
42
  end
35
43
  end
@@ -3,40 +3,40 @@ module Workon
3
3
  module Commands
4
4
  module InstallHelper
5
5
  BASH_PROFILE_PATH = '~/.bash_profile'
6
-
6
+
7
7
  def self.execute
8
8
  install unless installed?
9
9
  end
10
-
10
+
11
11
  def self.install
12
12
  puts "Installing bash helper function to #{bash_profile_path}"
13
-
13
+
14
14
  begin
15
15
  File.open(bash_profile_path, 'a') do |f|
16
16
  f.write "\n\n"
17
17
  f.write finder
18
18
  f.write helper_function
19
19
  end
20
-
20
+
21
21
  puts "... Success!"
22
22
  rescue => error
23
23
  puts "... Failed!"
24
24
  puts error
25
25
  end
26
26
  end
27
-
27
+
28
28
  def self.bash_profile_path
29
29
  BASH_PROFILE_PATH.sub '~', ENV['HOME']
30
30
  end
31
-
31
+
32
32
  def self.finder
33
33
  "# Created by workon\n"
34
34
  end
35
-
35
+
36
36
  def self.installed?
37
37
  !(File.read(bash_profile_path) =~ /#{finder}/).nil?
38
38
  end
39
-
39
+
40
40
  def self.helper_function
41
41
  <<'BASH'
42
42
  wo () {
@@ -5,69 +5,78 @@ module Workon
5
5
  class Configuration
6
6
  attr_reader :options
7
7
  attr_reader :parser
8
-
9
- def self.instance(*args)
10
- @_instance ||= new(*args)
11
- end
12
-
13
- def initialize(*args)
14
- @options = { show_project: false, without: [], only: [], install_helper: false, dump_configuration: false, project: nil, show_help: false }
15
- parse_options args.first unless args.empty?
8
+
9
+ def initialize(options = nil)
10
+ @options = {
11
+ show_project: false,
12
+ without: [],
13
+ only: [],
14
+ install_helper: false,
15
+ dump_configuration: false,
16
+ project: nil,
17
+ show_help: false
18
+ }
19
+
20
+ merge_options options unless blank? options
16
21
  end
17
-
18
- def parse_options(args)
19
- parser.parse! args
20
- options[:project] = args.first unless args.empty?
22
+
23
+ def merge_options(args)
24
+ if Hash === args
25
+ @options.merge! args
26
+ elsif Array === args
27
+ parser.parse! args
28
+ options[:project] = args.first unless args.empty?
29
+ end
21
30
  end
22
-
31
+
23
32
  def exists?(key)
24
33
  key = key.to_sym
25
34
  !blank? options[key]
26
35
  end
27
-
36
+
28
37
  def set(key, value)
29
38
  key = key.to_sym
30
39
  options[key] = value
31
40
  end
32
-
41
+
33
42
  def fetch(key, default = nil)
34
43
  key = key.to_sym
35
-
44
+
36
45
  if !exists?(key) && !blank?(default)
37
46
  set key, default
38
47
  end
39
-
48
+
40
49
  options[key]
41
50
  end
42
-
51
+
43
52
  def [](key)
44
53
  fetch key
45
54
  end
46
-
55
+
47
56
  def []=(key, value)
48
57
  set key, value
49
58
  end
50
-
59
+
51
60
  def parser
52
61
  @parser ||= OptionParser.new do |o|
53
- o.banner = "Usage: #{File.basename($0)} [options] project"
54
-
62
+ o.banner = "Usage: workon [options] project"
63
+
55
64
  o.on('-w', '--without ACTORS', Array, 'Exclude unwanted actors') do |v|
56
65
  options[:without] = v
57
66
  end
58
-
67
+
59
68
  o.on('-o', '--only ACTORS', Array, 'Only use certain actors') do |v|
60
69
  options[:only] = v
61
70
  end
62
-
71
+
63
72
  o.on('-d', '--dump-configuration', 'Dump workon configuration to project_path/.workonrc') do
64
73
  options[:dump_configuration] = true
65
74
  end
66
-
75
+
67
76
  o.on_tail('--install-helper', 'Install `wo\' helper function to ~/.bash_profile') do
68
77
  options[:install_helper] = true
69
78
  end
70
-
79
+
71
80
  o.on_tail('-P', '--show-project', TrueClass, "Echo project's directory") do
72
81
  options[:show_project] = true
73
82
  end
@@ -75,52 +84,52 @@ module Workon
75
84
  o.on_tail('-n', '--dry-run', 'Do not run any commands') do
76
85
  options[:dry_run] = true
77
86
  end
78
-
87
+
79
88
  o.on_tail('-v', '--version', 'Show version information') do
80
89
  puts Workon::VERSION
81
90
  exit
82
91
  end
83
-
92
+
84
93
  o.on_tail('-h', '--help', 'Show this help information') do
85
94
  options[:show_help] = true
86
95
  # exit
87
96
  end
88
97
  end
89
98
  end
90
-
99
+
91
100
  def project_rc_path
92
101
  @project_rc_path ||= File.join Workon.project_path, '.workonrc'
93
102
  end
94
-
103
+
95
104
  def project_rc_exists?
96
105
  File.exist? project_rc_path
97
106
  end
98
-
107
+
99
108
  def merge_project_rc
100
109
  if project_rc_exists?
101
- opts = YAML.load_file(project_rc_path)
102
- @options.merge! opts
110
+ merge_options YAML.load_file(project_rc_path)
103
111
  end
104
112
  end
105
-
113
+
106
114
  def dump_to_project_rc
107
115
  o = options.dup
108
116
  o.delete :install_helper
109
117
  o.delete :dump_configuration
110
118
  o.delete :project
111
119
  o.delete :show_help
112
-
120
+ o.delete :show_project
121
+
113
122
  begin
114
123
  File.open(project_rc_path, 'w') do |f|
115
124
  YAML.dump o, f
116
125
  end
117
-
126
+
118
127
  puts %(Saved workon configuration to #{project_rc_path})
119
128
  rescue
120
129
  STDERR.puts %(Could not save workon configuration to #{project_rc_path})
121
130
  end
122
131
  end
123
-
132
+
124
133
  private
125
134
  def blank?(object)
126
135
  object.respond_to?(:empty?) ? object.empty? : !object
@@ -0,0 +1,11 @@
1
+ module Workon
2
+ module RSpecHelpers
3
+ def stub_projectrc!(rc_file = 'projectrc')
4
+ fixtures_path = File.expand_path '../../../spec/fixtures', __FILE__
5
+ fixture_path = fixtures_path + "/#{rc_file}.yml"
6
+
7
+ subject.stub(:project_rc_exists?).and_return true
8
+ subject.stub(:project_rc_path).and_return fixture_path
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module Workon
2
- VERSION = "0.0.13"
2
+ VERSION = "0.0.15"
3
3
  end
@@ -0,0 +1,2 @@
1
+ ---
2
+ :port: 3000
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+ require 'workon/actor/server'
3
+
4
+ describe Workon::Actor::Server do
5
+ subject { described_class.new '/Users/mike/Work/ruby/henceforth' }
6
+
7
+ it "works?" do
8
+ subject.commit
9
+ end
10
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'workon/cli'
3
+
4
+ describe Workon::CLI do
5
+ before(:each) { Workon.instance_eval { @config = nil } }
6
+
7
+ it "shows help when asked" do
8
+ Workon.config show_help: true
9
+ described_class.should_receive(:show_help).and_return { exit }
10
+ expect { described_class.execute }.to raise_error SystemExit
11
+ end
12
+
13
+ it "installs bash helper when asked" do
14
+ Workon.config install_helper: true
15
+ described_class.should_receive(:install_helper).and_return { exit }
16
+ expect { described_class.execute }.to raise_error SystemExit
17
+ end
18
+
19
+ it "shows project path when asked" do
20
+ Workon.config show_project: true, project: 'foo'
21
+ described_class.should_receive(:show_project).and_return { exit }
22
+ expect { described_class.execute }.to raise_error SystemExit
23
+ end
24
+
25
+ it "dumps configuration" do
26
+ Workon.config dump_configuration: true, project: 'foo'
27
+ described_class.should_receive(:dump_configuration).and_return { exit }
28
+ expect { described_class.execute }.to raise_error SystemExit
29
+ end
30
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe Workon::Configuration do
4
+ subject { described_class.new }
5
+
6
+ describe "has defaults" do
7
+ its([:show_project]) { should be_false }
8
+ its([:without]) { should == [] }
9
+ its([:only]) { should == [] }
10
+ its([:install_helper]) { should be_false }
11
+ its([:dump_configuration]) { should be_false }
12
+ its([:project]) { should be_nil }
13
+ its([:show_help]) { should be_false }
14
+ its(:parser) { should be_an(OptionParser) }
15
+
16
+ describe "can be overriden" do
17
+ subject { described_class.new(dump_configuration: true) }
18
+
19
+ its([:dump_configuration]) { should be_true }
20
+ end
21
+ end
22
+
23
+ describe "works from ARGV (--show-project foo)" do
24
+ subject { described_class.new %w(--show-project foo) }
25
+
26
+ its([:project]) { should == "foo" }
27
+ its([:show_project]) { should be_true }
28
+ end
29
+
30
+ it "can tell if a key exists" do
31
+ subject.exists?(:foo).should be_false
32
+ end
33
+
34
+ it "can set things" do
35
+ new_value = :bar
36
+ subject.set :foo, new_value
37
+ subject[:foo].should == new_value
38
+ end
39
+
40
+ it "uses fetch to also set values" do
41
+ default_port = 3000
42
+ subject.fetch(:port, default_port).should == default_port
43
+ end
44
+
45
+
46
+ describe "with project .workonrc" do
47
+ it "can find project .workonrc" do
48
+ project_path = '/code/foo'
49
+ Workon.stub(:project_path).and_return project_path
50
+
51
+ subject.project_rc_path.should == project_path + '/.workonrc'
52
+ end
53
+
54
+ it "can merge project .workonrc" do
55
+ stub_projectrc!
56
+ subject.merge_project_rc
57
+ subject[:port].should == 3000
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Workon do
4
+ before do
5
+ Workon.stub(:all_directories) { %w(/code/foo /code/bar) }
6
+ end
7
+
8
+ before(:each) { Workon.instance_eval { @config = nil } }
9
+
10
+ it "finds a project" do
11
+ Workon.config[:project] = 'foo'
12
+ Workon.find_project
13
+ Workon.project_path.should == '/code/foo'
14
+ end
15
+
16
+ it "runs nothing when -n passed" do
17
+ Dir.stub(:chdir) { true }
18
+
19
+ Workon.config[:dry_run] = true
20
+ Workon.config[:project] = 'foo'
21
+ Workon.find_project
22
+ Workon.commit!
23
+
24
+ Kernel.should_not_receive :system
25
+ Kernel.should_not_receive :exec
26
+ end
27
+
28
+ it "ignores things in --without" do
29
+ Dir.stub(:chdir).with(Workon.project_path)
30
+ Workon::Actor::Server.should_not_receive :new
31
+ Workon.config project: 'foo', without: 'Server', dry_run: true
32
+ Workon.find_project
33
+ Workon.commit!
34
+ end
35
+ end
@@ -0,0 +1,8 @@
1
+ $TESTING = true
2
+
3
+ require 'workon'
4
+ require 'workon/rspec_helpers'
5
+
6
+ RSpec.configure do |c|
7
+ c.include Workon::RSpecHelpers
8
+ end
data/workon.gemspec CHANGED
@@ -13,7 +13,10 @@ Gem::Specification.new do |s|
13
13
  s.description = %q{Runs actions based on directories}
14
14
 
15
15
  # s.add_dependency "activesupport"
16
- # s.add_development_dependency "rspec"
16
+ s.add_development_dependency "rspec"
17
+ s.add_development_dependency "guard"
18
+ s.add_development_dependency "guard-rspec"
19
+ s.add_development_dependency "rb-fsevent" if RUBY_PLATFORM =~ /darwin/
17
20
 
18
21
  s.rubyforge_project = "workon"
19
22
 
metadata CHANGED
@@ -1,31 +1,74 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: workon
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.15
4
5
  prerelease:
5
- version: 0.0.13
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Mike Wyatt
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-05-29 00:00:00 Z
14
- dependencies: []
15
-
12
+ date: 2011-08-24 00:00:00.000000000 -02:30
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ requirement: &70248633807960 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: *70248633807960
26
+ - !ruby/object:Gem::Dependency
27
+ name: guard
28
+ requirement: &70248633807540 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *70248633807540
37
+ - !ruby/object:Gem::Dependency
38
+ name: guard-rspec
39
+ requirement: &70248633807120 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *70248633807120
48
+ - !ruby/object:Gem::Dependency
49
+ name: rb-fsevent
50
+ requirement: &70248633806660 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *70248633806660
16
59
  description: Runs actions based on directories
17
- email:
60
+ email:
18
61
  - wyatt.mike@gmail.com
19
- executables:
62
+ executables:
20
63
  - workon
21
64
  extensions: []
22
-
23
65
  extra_rdoc_files: []
24
-
25
- files:
66
+ files:
26
67
  - .gitignore
27
68
  - .rvmrc
28
69
  - Gemfile
70
+ - Guardfile
71
+ - README.md
29
72
  - Rakefile
30
73
  - bin/workon
31
74
  - lib/workon.rb
@@ -34,41 +77,59 @@ files:
34
77
  - lib/workon/actor/editor.rb
35
78
  - lib/workon/actor/finder.rb
36
79
  - lib/workon/actor/git.rb
80
+ - lib/workon/actor/guard.rb
81
+ - lib/workon/actor/helpers.rb
82
+ - lib/workon/actor/helpers/bundler.rb
83
+ - lib/workon/actor/helpers/commandable.rb
84
+ - lib/workon/actor/helpers/configurable.rb
85
+ - lib/workon/actor/helpers/muxable.rb
37
86
  - lib/workon/actor/middleman.rb
38
87
  - lib/workon/actor/passenger.rb
88
+ - lib/workon/actor/server.rb
89
+ - lib/workon/actor/unicorn.rb
39
90
  - lib/workon/actor/watchr.rb
40
91
  - lib/workon/actor/web_browser.rb
41
92
  - lib/workon/cli.rb
42
93
  - lib/workon/cli/commands.rb
43
94
  - lib/workon/configuration.rb
95
+ - lib/workon/rspec_helpers.rb
44
96
  - lib/workon/version.rb
97
+ - spec/fixtures/projectrc.yml
98
+ - spec/lib/workon/actor/server_spec.rb
99
+ - spec/lib/workon/cli_spec.rb
100
+ - spec/lib/workon/configuration_spec.rb
101
+ - spec/lib/workon_spec.rb
102
+ - spec/spec_helper.rb
45
103
  - workon.gemspec
46
- homepage: ""
104
+ has_rdoc: true
105
+ homepage: ''
47
106
  licenses: []
48
-
49
107
  post_install_message:
50
108
  rdoc_options: []
51
-
52
- require_paths:
109
+ require_paths:
53
110
  - lib
54
- required_ruby_version: !ruby/object:Gem::Requirement
111
+ required_ruby_version: !ruby/object:Gem::Requirement
55
112
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- version: "0"
60
- required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
118
  none: false
62
- requirements:
63
- - - ">="
64
- - !ruby/object:Gem::Version
65
- version: "0"
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
66
123
  requirements: []
67
-
68
124
  rubyforge_project: workon
69
- rubygems_version: 1.7.2
125
+ rubygems_version: 1.6.2
70
126
  signing_key:
71
127
  specification_version: 3
72
128
  summary: Runs actions based on directories
73
- test_files: []
74
-
129
+ test_files:
130
+ - spec/fixtures/projectrc.yml
131
+ - spec/lib/workon/actor/server_spec.rb
132
+ - spec/lib/workon/cli_spec.rb
133
+ - spec/lib/workon/configuration_spec.rb
134
+ - spec/lib/workon_spec.rb
135
+ - spec/spec_helper.rb