space 0.0.3 → 0.0.4

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.
Files changed (51) hide show
  1. data/Gemfile +2 -0
  2. data/Gemfile.lock +17 -2
  3. data/Guardfile +5 -0
  4. data/README.md +4 -0
  5. data/Rakefile +1 -1
  6. data/bin/space +2 -1
  7. data/lib/core_ext/{enumerable.rb → enumerable/map_slice.rb} +2 -7
  8. data/lib/core_ext/{string.rb → string/wrap.rb} +1 -2
  9. data/lib/space.rb +6 -16
  10. data/lib/space/app.rb +36 -48
  11. data/lib/space/app/command.rb +45 -0
  12. data/lib/space/app/command/builtin.rb +43 -0
  13. data/lib/space/app/command/development.rb +60 -0
  14. data/lib/space/app/handler.rb +47 -0
  15. data/lib/space/app/logger.rb +21 -0
  16. data/lib/space/{action → app}/parser.rb +3 -2
  17. data/lib/space/config.rb +14 -6
  18. data/lib/space/events.rb +34 -0
  19. data/lib/space/events/buffer.rb +18 -0
  20. data/lib/space/events/event.rb +14 -0
  21. data/lib/space/helpers.rb +30 -15
  22. data/lib/space/models.rb +7 -0
  23. data/lib/space/models/project.rb +48 -0
  24. data/lib/space/models/project/bundler.rb +30 -0
  25. data/lib/space/models/repo.rb +46 -29
  26. data/lib/space/models/repo/bundle.rb +39 -0
  27. data/lib/space/models/repo/dependency.rb +22 -0
  28. data/lib/space/models/repo/git.rb +52 -0
  29. data/lib/space/models/repos.rb +31 -26
  30. data/lib/space/models/repos/collection.rb +26 -0
  31. data/lib/space/models/repos/scope.rb +18 -0
  32. data/lib/space/screen.rb +19 -15
  33. data/lib/space/screen/dashboard.rb +28 -0
  34. data/lib/space/screen/progress.rb +15 -0
  35. data/lib/space/screen/view.rb +43 -0
  36. data/lib/space/shell.rb +56 -0
  37. data/lib/space/shell/command.rb +63 -0
  38. data/lib/space/shell/watch.rb +50 -0
  39. data/lib/space/shell/watcher.rb +40 -0
  40. data/lib/space/templates/{project.erb → header.erb} +0 -1
  41. data/lib/space/templates/{repository.erb → repo.erb} +1 -1
  42. data/lib/space/tmux.rb +11 -0
  43. data/lib/space/version.rb +1 -1
  44. metadata +33 -15
  45. data/lib/space/action.rb +0 -84
  46. data/lib/space/models/bundle.rb +0 -44
  47. data/lib/space/models/command.rb +0 -28
  48. data/lib/space/models/commands.rb +0 -23
  49. data/lib/space/models/dependency.rb +0 -18
  50. data/lib/space/models/git.rb +0 -23
  51. data/lib/space/view.rb +0 -25
data/Gemfile CHANGED
@@ -2,9 +2,11 @@ source :rubygems
2
2
 
3
3
  gem 'ansi'
4
4
  gem 'hashr'
5
+ gem 'rb-fsevent', git: 'git://github.com/niw/rb-fsevent.git'
5
6
 
6
7
  group :test do
7
8
  gem 'rake'
8
9
  gem 'rspec'
10
+ gem 'guard-rspec'
9
11
  gem 'mocha'
10
12
  end
data/Gemfile.lock CHANGED
@@ -1,9 +1,21 @@
1
+ GIT
2
+ remote: git://github.com/niw/rb-fsevent.git
3
+ revision: 8754b16bd3b880a60621e01b0f7792c009c8e8a7
4
+ specs:
5
+ rb-fsevent (0.4.3)
6
+
1
7
  GEM
2
8
  remote: http://rubygems.org/
3
9
  specs:
4
10
  ansi (1.4.2)
5
11
  diff-lcs (1.1.3)
6
- hashr (0.0.19)
12
+ ffi (1.0.11)
13
+ guard (1.0.1)
14
+ ffi (>= 0.5.0)
15
+ thor (~> 0.14.6)
16
+ guard-rspec (0.7.0)
17
+ guard (>= 0.10.0)
18
+ hashr (0.0.20)
7
19
  metaclass (0.0.1)
8
20
  mocha (0.10.5)
9
21
  metaclass (~> 0.0.1)
@@ -13,16 +25,19 @@ GEM
13
25
  rspec-expectations (~> 2.9.0)
14
26
  rspec-mocks (~> 2.9.0)
15
27
  rspec-core (2.9.0)
16
- rspec-expectations (2.9.0)
28
+ rspec-expectations (2.9.1)
17
29
  diff-lcs (~> 1.1.3)
18
30
  rspec-mocks (2.9.0)
31
+ thor (0.14.6)
19
32
 
20
33
  PLATFORMS
21
34
  ruby
22
35
 
23
36
  DEPENDENCIES
24
37
  ansi
38
+ guard-rspec
25
39
  hashr
26
40
  mocha
27
41
  rake
42
+ rb-fsevent!
28
43
  rspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/space/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/README.md CHANGED
@@ -1 +1,5 @@
1
1
  # Space [![Build Status](https://secure.travis-ci.org/svenfuchs/space.png?branch=master)](http://travis-ci.org/svenfuchs/space)
2
+
3
+ # TODO
4
+
5
+ * warn if some but not all repos are set to local
data/Rakefile CHANGED
@@ -6,4 +6,4 @@ RSpec::Core::RakeTask.new do |t|
6
6
  t.pattern = './spec/**/*_spec.rb'
7
7
  end
8
8
 
9
- task :default => :spec
9
+ task default: :spec
data/bin/space CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  $: << 'lib'
4
+ require 'bundler/setup'
4
5
  require 'space'
5
6
 
6
7
  abort 'Need to specify a project name' if ARGV.empty?
7
- Space::App.run(ARGV[0])
8
+ Space::App.new(ARGV[0]).run
@@ -1,13 +1,8 @@
1
1
  module Enumerable
2
- def map_with_index(&block)
3
- result = []
4
- each_with_index { |element, ix| result << yield(element, ix) }
5
- result
6
- end
7
-
8
2
  def map_slice(num, &block)
9
3
  result = []
10
4
  each_slice(num) { |element| result << yield(element) }
11
5
  result
12
- end
6
+ end unless method_defined?(:map_slice)
13
7
  end
8
+
@@ -1,7 +1,6 @@
1
1
  class String
2
2
  def wrap(width)
3
3
  gsub(/(.{1,#{width}})( +|$\n?)|(.{1,#{width}})/, "\\1\\3\n")
4
- end
4
+ end unless method_defined?(:wrap)
5
5
  end
6
6
 
7
-
data/lib/space.rb CHANGED
@@ -1,25 +1,15 @@
1
1
  require 'yaml'
2
2
  require 'hashr'
3
- require 'core_ext/enumerable'
4
3
 
5
4
  module Space
6
- autoload :Action, 'space/action'
5
+ # autoload :Action, 'space/action'
7
6
  autoload :App, 'space/app'
8
7
  autoload :Config, 'space/config'
8
+ autoload :Events, 'space/events'
9
9
  autoload :Helpers, 'space/helpers'
10
- autoload :Bundle, 'space/models/bundle'
11
- autoload :Commands, 'space/models/commands'
12
- autoload :Command, 'space/models/command'
13
- autoload :Dependency, 'space/models/dependency'
14
- autoload :Git, 'space/models/git'
15
- autoload :Repos, 'space/models/repos'
16
- autoload :Repo, 'space/models/repo'
10
+ autoload :Models, 'space/models'
17
11
  autoload :Screen, 'space/screen'
18
- autoload :System, 'space/system'
19
- autoload :View, 'space/view'
20
-
21
- TEMPLATES = {
22
- :project => 'lib/space/templates/project.erb',
23
- :repo => 'lib/space/templates/repository.erb'
24
- }
12
+ autoload :Shell, 'space/shell'
13
+ autoload :Tmux, 'space/tmux'
25
14
  end
15
+
data/lib/space/app.rb CHANGED
@@ -2,71 +2,59 @@ require 'readline'
2
2
 
3
3
  module Space
4
4
  class App
5
- class << self
6
- attr_reader :instance
7
-
8
- def run(name)
9
- @instance = new(name)
10
- instance.run
11
- end
12
-
13
- def name
14
- instance.name
15
- end
5
+ autoload :Command, 'space/app/command'
6
+ autoload :Handler, 'space/app/handler'
7
+ autoload :Logger, 'space/app/logger'
8
+ autoload :Parser, 'space/app/parser'
16
9
 
17
- def config
18
- instance.config
10
+ class << self
11
+ def logger
12
+ @logger ||= Logger.new
19
13
  end
20
14
  end
21
15
 
22
16
  include Readline
23
17
 
24
- attr_accessor :screen, :name, :config, :repos, :bundle, :path
18
+ attr_reader :name, :project, :screen
25
19
 
26
20
  def initialize(name)
27
- @screen = Screen.new(self)
28
- @name = name
29
- @config = Config.load(name)
30
- @bundle = Bundle.new(config.paths.first)
31
- @path = File.expand_path('.')
32
- end
21
+ @name = name
22
+ @project = Models::Project.new(name)
23
+ @screen = Screen.new(project)
33
24
 
34
- def prompt
35
- # "#{repos.name} >".strip + ' '
36
- '> '
37
- end
38
-
39
- def repos
40
- @repos ||= Repos.all
25
+ project.subscribe(screen)
41
26
  end
42
27
 
43
28
  def run
44
- screen.render
45
- loop do
46
- line = readline(prompt, true)
47
- break if line.nil?
48
- handle(line) unless line.empty?
49
- end
50
- puts
29
+ refresh
30
+ screen.display(:dashboard)
31
+ cli_loop
51
32
  end
52
33
 
53
- def handle(line)
54
- Action.run(self, line)
55
- screen.render
56
- end
34
+ private
57
35
 
58
- def reset
59
- bundle.reset
60
- repos.each(&:reset)
61
- end
36
+ def refresh
37
+ screen.display(:progress)
38
+ project.refresh
39
+ end
62
40
 
63
- def execute(cmd)
64
- chdir { system(cmd) }
65
- end
41
+ def cli_loop
42
+ loop do
43
+ line = readline(prompt, true)
44
+ break if line.nil?
45
+ handle(line) unless line.empty?
46
+ end
47
+ end
66
48
 
67
- def chdir(&block)
68
- Dir.chdir(path, &block)
69
- end
49
+ def handle(line)
50
+ screen.display(:progress)
51
+ Handler.new(project).run(line)
52
+ screen.display(:dashboard)
53
+ end
54
+
55
+ def prompt
56
+ "#{project.repos.scoped? ? project.repos.scope.map { |r| r.name }.join(', ') : project.name} > "
57
+ end
70
58
  end
71
59
  end
72
60
 
@@ -0,0 +1,45 @@
1
+ module Space
2
+ class App
3
+ class Command
4
+ autoload :Execute, 'space/app/command/builtin'
5
+ autoload :Refresh, 'space/app/command/builtin'
6
+ autoload :Scope, 'space/app/command/builtin'
7
+ autoload :Unscope, 'space/app/command/builtin'
8
+
9
+ autoload :Local, 'space/app/command/development'
10
+ autoload :Remote, 'space/app/command/development'
11
+
12
+ attr_reader :project, :scope, :args
13
+
14
+ def initialize(project, scope, *args)
15
+ @project = project
16
+ @scope = scope
17
+ @args = args
18
+ end
19
+
20
+ def run
21
+ raise 'not implemented'
22
+ end
23
+
24
+ private
25
+
26
+ def repos
27
+ @repos ||= project.repos.select_by_names(scope)
28
+ end
29
+
30
+ def in_scope
31
+ repos.each { |repo| yield repo }
32
+ end
33
+
34
+ def system(cmd)
35
+ puts cmd
36
+ super
37
+ end
38
+
39
+ def confirm
40
+ puts "\n--- hit any key to continue ---\n"
41
+ STDIN.getc
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,43 @@
1
+ module Space
2
+ class App
3
+ class Command
4
+ class Execute < Command
5
+ def run
6
+ Bundler.with_clean_env do
7
+ in_scope do |repo|
8
+ repo.buffering do
9
+ puts
10
+ repo.execute(*args)
11
+ end
12
+ end
13
+ confirm
14
+ end
15
+ end
16
+ end
17
+
18
+ class Refresh < Command
19
+ def run
20
+ Bundler.with_clean_env do
21
+ project.bundler.refresh
22
+ in_scope do |repo|
23
+ repo.refresh
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ class Scope < Command
30
+ def run
31
+ project.repos.scope = repos
32
+ end
33
+ end
34
+
35
+ class Unscope < Command
36
+ def run
37
+ project.repos.scope = nil
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
@@ -0,0 +1,60 @@
1
+ module Space
2
+ class App
3
+ class Command
4
+ class Local < Command
5
+ def run
6
+ Shell::Watcher.suspend do
7
+ repos.each do |repo|
8
+ system "bundle config --global local.#{repo.name} #{repo.path}"
9
+ end
10
+ confirm
11
+ end
12
+ project.bundler.refresh
13
+ end
14
+ end
15
+
16
+ class Remote < Command
17
+ def run
18
+ Shell::Watcher.suspend do
19
+ repos.each do |repo|
20
+ system "bundle config --delete local.#{repo.name}"
21
+ end
22
+ confirm
23
+ end
24
+ project.bundler.refresh
25
+ end
26
+ end
27
+
28
+ # class Install < Command
29
+ # def run
30
+ # in_scope do |repo|
31
+ # repo.execute 'bundle install'
32
+ # repo.refresh
33
+ # end
34
+ # end
35
+ # end
36
+
37
+ # class Update < Command
38
+ # def run
39
+ # in_scope do |repo|
40
+ # repo.execute 'bundle update'
41
+ # repo.execute 'git commit -am "bump dependencies"'
42
+ # repo.refresh
43
+ # end
44
+ # end
45
+ # end
46
+
47
+ # class Checkout < Command
48
+ # def run
49
+ # # check if branch exists, git co (-b)
50
+ # end
51
+ # end
52
+
53
+ # class PullDeps < Command
54
+ # def run
55
+ # # pull all dependencies
56
+ # end
57
+ # end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,47 @@
1
+ module Space
2
+ class App
3
+ class Handler
4
+ ALIASES = {
5
+ '' => 'scope',
6
+ '-' => 'unscope',
7
+ 'r' => 'refresh'
8
+ }
9
+ attr_reader :project
10
+
11
+ def initialize(project)
12
+ @project = project
13
+ end
14
+
15
+ def run(line)
16
+ scope, type = parse(line)
17
+ command = command_for(scope, type)
18
+ command.run
19
+ end
20
+
21
+ private
22
+
23
+ def command_for(scope, type)
24
+ const = const_for(type)
25
+ args = [project, scope]
26
+ args << type if const == Command::Execute
27
+ const.new(*args)
28
+ end
29
+
30
+ def parse(line)
31
+ Parser.new(project.names).parse(line)
32
+ end
33
+
34
+ def const_for(type)
35
+ Command.const_get(const_name(type))
36
+ rescue NameError
37
+ Command::Execute
38
+ end
39
+
40
+ def const_name(type)
41
+ type = (type || '').strip
42
+ type = ALIASES[type] if ALIASES.key?(type)
43
+ type.capitalize
44
+ end
45
+ end
46
+ end
47
+ end