workon 0.0.13 → 0.0.15

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/.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