space 0.0.5 → 0.0.6

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 (47) hide show
  1. data/bin/space +6 -0
  2. data/lib/core_ext/string/deansi.rb +7 -0
  3. data/lib/core_ext/string/demodulize.rb +5 -0
  4. data/lib/space.rb +4 -4
  5. data/lib/space/action.rb +43 -0
  6. data/lib/space/action/builtin.rb +43 -0
  7. data/lib/space/action/development.rb +56 -0
  8. data/lib/space/{app → action}/handler.rb +17 -9
  9. data/lib/space/{app → action}/parser.rb +4 -7
  10. data/lib/space/app.rb +14 -30
  11. data/lib/space/events.rb +27 -20
  12. data/lib/space/events/sources.rb +34 -0
  13. data/lib/space/events/subscription.rb +23 -0
  14. data/lib/space/logger.rb +34 -0
  15. data/lib/space/model.rb +7 -0
  16. data/lib/space/{models → model}/project.rb +4 -10
  17. data/lib/space/{models → model}/project/bundler.rb +7 -8
  18. data/lib/space/model/project/bundler/config.rb +30 -0
  19. data/lib/space/model/repo.rb +38 -0
  20. data/lib/space/{models → model}/repo/bundle.rb +6 -7
  21. data/lib/space/{models → model}/repo/dependency.rb +1 -1
  22. data/lib/space/{models → model}/repo/git.rb +14 -16
  23. data/lib/space/{models → model}/repos.rb +18 -9
  24. data/lib/space/{models → model}/repos/collection.rb +1 -1
  25. data/lib/space/{models → model}/repos/scope.rb +1 -1
  26. data/lib/space/screen.rb +28 -11
  27. data/lib/space/screen/dashboard.rb +21 -5
  28. data/lib/space/screen/progress.rb +16 -5
  29. data/lib/space/screen/view.rb +2 -6
  30. data/lib/space/source.rb +51 -0
  31. data/lib/space/source/command.rb +70 -0
  32. data/lib/space/source/watch.rb +64 -0
  33. data/lib/space/source/watcher.rb +32 -0
  34. data/lib/space/version.rb +1 -1
  35. metadata +27 -24
  36. data/lib/space/app/command.rb +0 -45
  37. data/lib/space/app/command/builtin.rb +0 -43
  38. data/lib/space/app/command/development.rb +0 -60
  39. data/lib/space/app/logger.rb +0 -21
  40. data/lib/space/events/buffer.rb +0 -18
  41. data/lib/space/events/event.rb +0 -14
  42. data/lib/space/models.rb +0 -7
  43. data/lib/space/models/repo.rb +0 -57
  44. data/lib/space/shell.rb +0 -56
  45. data/lib/space/shell/command.rb +0 -63
  46. data/lib/space/shell/watch.rb +0 -50
  47. data/lib/space/shell/watcher.rb +0 -40
@@ -1,21 +0,0 @@
1
- require 'logger'
2
- require 'fileutils'
3
-
4
- module Space
5
- class App
6
- class Logger < ::Logger
7
- def initialize
8
- truncate
9
- super('/tmp/space.log')
10
- end
11
-
12
- def truncate
13
- File.open(filename, 'w+') { |f| f.write('-' * 80 + "\n") }
14
- end
15
-
16
- def filename
17
- '/tmp/space.log'
18
- end
19
- end
20
- end
21
- end
@@ -1,18 +0,0 @@
1
- module Space
2
- module Events
3
- class Buffer < Array
4
- def push(event)
5
- # if any? { |e| e.source == event.source }
6
- # App.logger.debug("REJECT event #{event.event.inspect} on #{event.source.class.name.split("\\n").last}")
7
- # else
8
- super
9
- # end
10
- end
11
-
12
- def flush
13
- each { |event| event.source.notify(*event) }
14
- clear
15
- end
16
- end
17
- end
18
- end
@@ -1,14 +0,0 @@
1
- module Space
2
- module Events
3
- class Event
4
- attr_reader :source, :event, :data
5
-
6
- def initialize(source, event, data = {})
7
- @source = source
8
- @event = event
9
- @data = data
10
- end
11
- end
12
- end
13
- end
14
-
@@ -1,7 +0,0 @@
1
- module Space
2
- module Models
3
- autoload :Project, 'space/models/project'
4
- autoload :Repos, 'space/models/repos'
5
- autoload :Repo, 'space/models/repo'
6
- end
7
- end
@@ -1,57 +0,0 @@
1
- module Space
2
- module Models
3
- class Repo
4
- autoload :Bundle, 'space/models/repo/bundle'
5
- autoload :Dependency, 'space/models/repo/dependency'
6
- autoload :Git, 'space/models/repo/git'
7
-
8
- include Events
9
-
10
- attr_reader :project, :path, :git, :bundle
11
-
12
- def initialize(project, path)
13
- @project = project
14
- @path = File.expand_path(path)
15
- @git = Git.new(self)
16
- @bundle = Bundle.new(self, project.repos)
17
- end
18
-
19
- def name
20
- @name ||= File.basename(path)
21
- end
22
-
23
- def number
24
- @number ||= project.number(name)
25
- end
26
-
27
- def ref
28
- git.commit
29
- end
30
-
31
- def deps
32
- bundle.deps
33
- end
34
-
35
- def refresh
36
- git.refresh
37
- bundle.refresh
38
- end
39
-
40
- def execute(cmd)
41
- chdir do
42
- puts "in #{path}".ansi(:bold, :yellow)
43
- system(cmd)
44
- end
45
- end
46
-
47
- def chdir(&block)
48
- Dir.chdir(path, &block)
49
- end
50
-
51
- def subscribe(*args)
52
- super
53
- [git, bundle].each { |object| object.subscribe(self) }
54
- end
55
- end
56
- end
57
- end
@@ -1,56 +0,0 @@
1
- module Space
2
- module Shell
3
- autoload :Command, 'space/shell/command'
4
- autoload :Watch, 'space/shell/watch'
5
- autoload :Watcher, 'space/shell/watcher'
6
-
7
- module ClassMethods
8
- def commands(commands = nil)
9
- commands ? @commands = commands : @commands
10
- end
11
-
12
- def watch(*paths)
13
- paths.empty? ? (@paths || []) : (@paths = paths)
14
- end
15
- end
16
-
17
- include Watcher
18
-
19
- class << self
20
- def included(base)
21
- base.extend(ClassMethods)
22
- end
23
-
24
- def all
25
- @all ||= []
26
- end
27
-
28
- def refresh
29
- all.map(&:refresh)
30
- end
31
- end
32
-
33
- attr_reader :path
34
-
35
- def initialize(path = '.')
36
- @path = File.expand_path(path)
37
- Shell.all << self
38
- super
39
- end
40
-
41
- def result(command)
42
- commands[command].result
43
- end
44
-
45
- def commands
46
- @commands ||= self.class.commands.inject({}) do |commands, (key, command)|
47
- commands.merge(key => Command.new(self, command))
48
- end
49
- end
50
-
51
- def refresh
52
- commands.each { |key, command| command.run }
53
- # notify(:refresh, self.class.name)
54
- end
55
- end
56
- end
@@ -1,63 +0,0 @@
1
- require 'ansi/code'
2
-
3
- module Space
4
- module Shell
5
- class Command
6
- class << self
7
- def execute(command)
8
- `#{command}`
9
- end
10
- end
11
-
12
- attr_reader :context, :command, :result
13
-
14
- def initialize(context, command)
15
- @context = context
16
- @command = command
17
- end
18
-
19
- def run
20
- Watcher.suspend do
21
- App.logger.debug "RUNNING #{command} [#{context.path}]"
22
- notifying do
23
- @result = chain.call
24
- end
25
- end
26
- end
27
-
28
- private
29
-
30
- def notifying(&block)
31
- old = result
32
- yield.tap do |new|
33
- notify unless old == new
34
- end
35
- end
36
-
37
- def notify
38
- context.notify(command, result)
39
- end
40
-
41
- def chain
42
- runner = -> { clean(self.class.execute(command)) }
43
- filters.reverse.inject(runner) { |runner, filter| -> { filter.call(&runner) } }
44
- end
45
-
46
- def filters
47
- [method(:chdir), ::Bundler.method(:with_clean_env) ]
48
- end
49
-
50
- def chdir(&block)
51
- Dir.chdir(context.path) { |path| block.call }
52
- end
53
-
54
- def clean(string)
55
- strip_ansi(string.chomp)
56
- end
57
-
58
- def strip_ansi(string)
59
- string.gsub(ANSI::Code::PATTERN, '')
60
- end
61
- end
62
- end
63
- end
@@ -1,50 +0,0 @@
1
- require 'rb-fsevent'
2
-
3
- module Space
4
- module Shell
5
- class Watch
6
- LATENCY = 0
7
- NO_DEFER = FALSE
8
-
9
- attr_reader :path, :callback, :mutex
10
-
11
- def initialize(path, &block)
12
- @path = File.expand_path(path)
13
- @callback = block
14
- @mutex = Mutex.new
15
- self
16
- end
17
-
18
- def run
19
- Thread.new do
20
- App.logger.debug("WATCHING #{path}")
21
- watch
22
- end
23
- end
24
-
25
- private
26
-
27
- def watch
28
- fsevent.watch(path, file: file?, latency: LATENCY, no_defer: NO_DEFER) do |paths|
29
- App.logger.debug("WATCH triggered: #{paths.inspect}")
30
- fsevent.stop
31
- mutex.synchronize do
32
- callback.call(paths)
33
- end
34
- fsevent.run
35
- end
36
- fsevent.run
37
- rescue Exception => e
38
- puts e.message, e.backtrace
39
- end
40
-
41
- def file?
42
- File.file?(path)
43
- end
44
-
45
- def fsevent
46
- @fsevent ||= FSEvent.new
47
- end
48
- end
49
- end
50
- end
@@ -1,40 +0,0 @@
1
- module Space
2
- module Shell
3
- module Watcher
4
- class << self
5
- def suspend
6
- @suspended = true
7
- yield.tap do
8
- @suspended = false
9
- end
10
- end
11
-
12
- def suspended?
13
- !!@suspended
14
- end
15
- end
16
-
17
- def initialize(*args)
18
- watch
19
- end
20
-
21
- private
22
-
23
- def watch
24
- targets.each do |path|
25
- Watch.new(path, &method(:trigger)).run
26
- end
27
- end
28
-
29
- def trigger(paths)
30
- refresh unless Watcher.suspended?
31
- end
32
-
33
- def targets
34
- self.class.watch.map do |path|
35
- path[0, 1] == '~' ? path : "#{self.path}/#{path}"
36
- end
37
- end
38
- end
39
- end
40
- end