tty 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +9 -9
  3. data/CHANGELOG.md +27 -10
  4. data/CODE_OF_CONDUCT.md +49 -0
  5. data/Gemfile +2 -2
  6. data/README.md +40 -182
  7. data/appveyor.yml +23 -0
  8. data/lib/tty.rb +2 -65
  9. data/lib/tty/plugins.rb +46 -19
  10. data/lib/tty/plugins/plugin.rb +4 -9
  11. data/lib/tty/version.rb +1 -1
  12. data/spec/fixtures/foo-0.0.1.gemspec +17 -0
  13. data/spec/spec_helper.rb +12 -0
  14. data/spec/tty/plugins/find_spec.rb +11 -19
  15. data/spec/tty/plugins/load_spec.rb +6 -10
  16. data/spec/tty/plugins/plugin/load_spec.rb +15 -5
  17. data/spec/tty/plugins/plugin/new_spec.rb +3 -6
  18. data/spec/tty/tty_spec.rb +1 -7
  19. data/tty.gemspec +11 -9
  20. metadata +89 -94
  21. data/lib/tty/logger.rb +0 -85
  22. data/lib/tty/support/coercion.rb +0 -30
  23. data/lib/tty/support/delegatable.rb +0 -44
  24. data/lib/tty/support/unicode.rb +0 -35
  25. data/lib/tty/system.rb +0 -14
  26. data/lib/tty/system/editor.rb +0 -114
  27. data/lib/tty/terminal.rb +0 -21
  28. data/lib/tty/terminal/home.rb +0 -42
  29. data/lib/tty/vector.rb +0 -116
  30. data/spec/tty/logger/log_spec.rb +0 -23
  31. data/spec/tty/logger/new_spec.rb +0 -36
  32. data/spec/tty/logger/valid_level_spec.rb +0 -33
  33. data/spec/tty/support/coercion_spec.rb +0 -41
  34. data/spec/tty/support/delegatable_spec.rb +0 -28
  35. data/spec/tty/support/fixtures/classes.rb +0 -19
  36. data/spec/tty/system/editor/available_spec.rb +0 -40
  37. data/spec/tty/system/editor/build_spec.rb +0 -32
  38. data/spec/tty/system/editor/command_spec.rb +0 -17
  39. data/spec/tty/system/editor/executables_spec.rb +0 -13
  40. data/spec/tty/system/editor/invoke_spec.rb +0 -34
  41. data/spec/tty/system/editor/open_spec.rb +0 -29
  42. data/spec/tty/terminal/home_spec.rb +0 -27
  43. data/spec/tty/vector/new_spec.rb +0 -48
@@ -0,0 +1,23 @@
1
+ ---
2
+ install:
3
+ - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
4
+ - ruby --version
5
+ - gem --version
6
+ - bundle install
7
+ build: off
8
+ test_script:
9
+ - bundle exec rake ci
10
+ environment:
11
+ matrix:
12
+ - ruby_version: "193"
13
+ - ruby_version: "200"
14
+ - ruby_version: "200-x64"
15
+ - ruby_version: "21"
16
+ - ruby_version: "21-x64"
17
+ - ruby_version: "22"
18
+ - ruby_version: "22-x64"
19
+ - ruby_version: "23"
20
+ - ruby_version: "23-x64"
21
+ matrix:
22
+ allow_failures:
23
+ - ruby_version: "193"
data/lib/tty.rb CHANGED
@@ -1,48 +1,10 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'equatable'
4
- require 'pastel'
5
- require 'tty-pager'
6
- require 'tty-platform'
7
- require 'tty-progressbar'
8
- require 'tty-screen'
9
- require 'tty-spinner'
10
- require 'tty-table'
11
- require 'tty-which'
12
-
13
3
  require 'tty/version'
14
- require 'tty/support/delegatable'
15
- require 'tty/support/coercion'
16
- require 'tty/support/unicode'
17
- require 'tty/terminal'
18
- require 'tty/system'
19
- require 'tty/vector'
20
- require 'tty/logger'
21
4
  require 'tty/plugins'
22
5
  require 'tty/plugins/plugin'
23
- require 'tty/terminal/home'
24
- require 'tty/system/editor'
25
6
 
26
7
  module TTY
27
-
28
- # Raised when the argument type is different from expected
29
- class TypeError < ArgumentError; end
30
-
31
- # Raised when the operation is not implemented
32
- class NoImplementationError < NotImplementedError; end
33
-
34
- # Raised when the passed in validation argument is of wrong type
35
- class ValidationCoercion < TypeError; end
36
-
37
- # Raised when the attribute is unknown
38
- class UnknownAttributeError < IndexError; end
39
-
40
- # Raised when command cannot be invoked
41
- class CommandInvocationError < StandardError; end
42
-
43
- # An empty array used as a default value
44
- EMPTY_ARRAY = Array.new.freeze
45
-
46
8
  class << self
47
9
  def included(base)
48
10
  base.send :extend, ClassMethods
@@ -50,33 +12,6 @@ module TTY
50
12
  end
51
13
 
52
14
  module ClassMethods
53
- # Return shared terminal instance
54
- #
55
- # @return [TTY::Terminal]
56
- #
57
- # @api public
58
- def terminal
59
- @terminal ||= Terminal.new
60
- end
61
-
62
- # Return shared shell instance
63
- #
64
- # @return [TTY::Shell]
65
- #
66
- # @api public
67
- # def shell(input=$stdin, output=$stdout)
68
- # @shell ||= Shell.new(input, output)
69
- # end
70
-
71
- # Return shared system object
72
- #
73
- # @return [TTY::System]
74
- #
75
- # @api public
76
- def system
77
- System
78
- end
79
-
80
15
  # Return shared plugins instance
81
16
  #
82
17
  # @return [TTY::Plugins]
@@ -89,3 +24,5 @@ module TTY
89
24
 
90
25
  extend ClassMethods
91
26
  end # TTY
27
+
28
+ TTY.plugins.find('tty').load
@@ -3,10 +3,9 @@
3
3
  module TTY
4
4
  # A class responsible for managing plugins installation
5
5
  class Plugins
6
- PLUGIN_PREFIX = 'tty'
6
+ include Enumerable
7
7
 
8
- attr_accessor :plugins
9
- private :plugins
8
+ attr_reader :plugins
10
9
 
11
10
  # Initialize the Plugins
12
11
  #
@@ -15,13 +14,17 @@ module TTY
15
14
  @plugins = []
16
15
  end
17
16
 
18
- # Load all plugins that are not enabled
17
+ # Iterate over plugins
18
+ # @example
19
+ # plugins.each { |plug| ... }
20
+ #
21
+ # @return [self]
19
22
  #
20
23
  # @api public
21
- def load
22
- plugins.each do |plugin|
23
- plugin.load! unless plugin.enabled?
24
- end
24
+ def each(&block)
25
+ return to_enum unless block_given?
26
+ to_ary.each(&block)
27
+ self
25
28
  end
26
29
 
27
30
  # Register plugin with name in internal array
@@ -32,22 +35,35 @@ module TTY
32
35
  #
33
36
  # @api public
34
37
  def register(name, plugin = false)
35
- if plugin && !loaded?(name)
36
- plugins << plugin
37
- end
38
+ return unless plugin && !loaded?(name)
39
+ @plugins << plugin
38
40
  end
39
41
 
40
42
  # Find all installed TTY plugins and store them
41
43
  #
44
+ # @param [String] :lib_name
45
+ #
46
+ # @return [self]
47
+ #
42
48
  # @api private
43
- def find
49
+ def find(lib_name = 'tty')
44
50
  Gem.refresh
45
- Gem::Specification.each do |gem|
46
- next unless gem.name =~ /^#{PLUGIN_PREFIX}/
47
- plugin_name = gem.name[/^#{PLUGIN_PREFIX}-(.*)/, 1]
51
+ spec = Gem::Specification.find_by_name(lib_name)
52
+ spec.runtime_dependencies.each do |gem|
53
+ next unless gem.name =~ /^#{lib_name}/
54
+ plugin_name = gem.name[/^#{lib_name}-(.*)/]
48
55
  register(plugin_name, Plugin.new(plugin_name, gem))
49
56
  end
50
- plugins
57
+ self
58
+ end
59
+
60
+ # Load all plugins that are not enabled
61
+ #
62
+ # @api public
63
+ def load
64
+ plugins.each do |plugin|
65
+ plugin.load! unless plugin.enabled?
66
+ end
51
67
  end
52
68
 
53
69
  # Return a list of all plugin names as strings
@@ -60,13 +76,24 @@ module TTY
60
76
  end
61
77
  end
62
78
 
63
- private
64
-
65
79
  # Check if plugin is already loaded
66
80
  #
67
81
  # @api private
68
82
  def loaded?(name)
69
- plugins.any? { |plugin| plugin.gem_name == name }
83
+ plugins.any? { |plugin| plugin.name == name }
84
+ end
85
+
86
+ def to_ary
87
+ @plugins.dup
88
+ end
89
+
90
+ def to_a
91
+ to_ary
92
+ end
93
+
94
+ def size
95
+ to_ary.size
70
96
  end
97
+ alias length size
71
98
  end # PluginManager
72
99
  end # TTY
@@ -7,10 +7,6 @@ module TTY
7
7
 
8
8
  attr_reader :gem
9
9
 
10
- attr_reader :gem_name
11
-
12
- attr_accessor :enabled
13
-
14
10
  # Initialize a Plugin
15
11
  #
16
12
  # @param [String] name
@@ -23,7 +19,6 @@ module TTY
23
19
  def initialize(name, gem)
24
20
  @name = name
25
21
  @gem = gem
26
- @gem_name = "tty-#{name}"
27
22
  @enabled = false
28
23
  end
29
24
 
@@ -33,7 +28,7 @@ module TTY
33
28
  #
34
29
  # @api public
35
30
  def enabled?
36
- enabled
31
+ @enabled
37
32
  end
38
33
 
39
34
  # Load the plugin (require the gem)
@@ -41,11 +36,11 @@ module TTY
41
36
  # @api public
42
37
  def load!
43
38
  begin
44
- require gem_name unless enabled?
39
+ require name unless enabled?
45
40
  rescue LoadError => error
46
- puts("Unable to load plugin #{gem_name} due to #{error}.")
41
+ puts("Unable to load plugin #{name} due to #{error}.")
47
42
  rescue => error
48
- puts("require '#{gem_name}' failed with #{error}")
43
+ puts("require '#{name}' failed with #{error}")
49
44
  end
50
45
  @enabled = true
51
46
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module TTY
4
- VERSION = "0.5.0"
4
+ VERSION = "0.6.0"
5
5
  end # TTY
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'foo'
5
+ spec.version = '0.0.1'
6
+ spec.platform = 'ruby'
7
+ spec.require_paths = ['lib']
8
+ spec.summary = 'A foo gem'
9
+
10
+ spec.add_dependency 'pastel'
11
+ spec.add_dependency 'equatable'
12
+ spec.add_dependency 'tty-command', '~> 0.3.0'
13
+ spec.add_dependency 'tty-prompt', '~> 0.10.0'
14
+ spec.add_dependency 'tty-spinner', '~> 0.4.0'
15
+
16
+ spec.add_development_dependency 'rake'
17
+ end
@@ -14,9 +14,21 @@ if ENV['TRAVIS'] || ENV['COVERAGE']
14
14
  end
15
15
  end
16
16
 
17
+ require 'rubygems'
17
18
  require 'tty'
18
19
 
20
+ module Helpers
21
+ def fixtures_dir
22
+ File.join(File.dirname(__FILE__), 'fixtures')
23
+ end
24
+
25
+ def fixtures_path(filename = nil)
26
+ File.join(File.dirname(__FILE__), 'fixtures', filename.to_s)
27
+ end
28
+ end
29
+
19
30
  RSpec.configure do |config|
31
+ config.include(Helpers)
20
32
  config.run_all_when_everything_filtered = true
21
33
  config.filter_run :focus
22
34
  config.order = 'random'
@@ -3,26 +3,18 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe TTY::Plugins, '#find' do
6
- let(:object) { described_class }
7
- let(:tty_gem) { Gem::Specification.new('tty-console', '3.1.3')}
8
- let(:gem) { Gem::Specification.new('thor', '1.1.4') }
9
- let(:gems) { [gem, tty_gem] }
6
+ it "finds gems with a specific prefix" do
7
+ plugins = TTY::Plugins.new
8
+ spec = Gem::Specification.load fixtures_path('foo-0.0.1.gemspec')
9
+ allow(Gem::Specification).to receive(:find_by_name).with('tty').
10
+ and_return(spec)
10
11
 
11
- before {
12
- allow(Gem).to receive(:refresh)
13
- allow(Gem::Specification).to receive(:each).and_yield(tty_gem).and_yield(gem)
14
- }
12
+ plugins.find('tty')
15
13
 
16
- subject { object.new }
17
-
18
- it 'inserts the tty gem only' do
19
- found = subject.find
20
- expect(found.size).to eq(1)
21
- expect(found.first.gem).to eql(tty_gem)
22
- end
23
-
24
- it 'retrieves only tty plugin' do
25
- subject.find
26
- expect(subject.names['console'].gem).to eql(tty_gem)
14
+ expect(plugins.to_a.map(&:name)).to eq([
15
+ 'tty-command',
16
+ 'tty-prompt',
17
+ 'tty-spinner'
18
+ ])
27
19
  end
28
20
  end
@@ -3,17 +3,13 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe TTY::Plugins, '#load' do
6
- let(:object) { described_class }
7
- let(:plugin) { double(:plugin, :enabled? => false) }
8
- let(:plugins) { [plugin, plugin]}
9
-
10
- subject { object.new }
6
+ it "activates all plugins" do
7
+ plugin = double(:plugin, :enabled? => false, :load! => true)
8
+ plugins = TTY::Plugins.new
9
+ allow(plugins).to receive(:plugins).and_return([plugin, plugin])
11
10
 
12
- before { allow(subject).to receive(:plugins).and_return(plugins) }
11
+ plugins.load
13
12
 
14
- it "activates all plugins" do
15
- allow(plugin).to receive(:load!)
16
- subject.load
17
- expect(plugin).to have_received(:load!).twice()
13
+ expect(plugin).to have_received(:load!).twice
18
14
  end
19
15
  end
@@ -4,21 +4,31 @@ require 'spec_helper'
4
4
 
5
5
  describe TTY::Plugin, '#load!' do
6
6
  let(:gem) { Gem::Specification.new('tty-console', '3.1.3')}
7
- let(:name) { 'console'}
8
7
 
9
- subject(:plugin) { described_class.new(name, gem) }
8
+ it "loads a gem" do
9
+ plugin = TTY::Plugin.new('tty-console', gem)
10
+ allow(plugin).to receive(:require).with('tty-console').and_return(true)
11
+
12
+ plugin.load!
13
+
14
+ expect(plugin).to have_received(:require).once
15
+ end
10
16
 
11
17
  it 'fails to load the gem' do
12
- allow(Kernel).to receive(:require) { raise LoadError }
18
+ plugin = TTY::Plugin.new('tty-console', gem)
19
+ allow(plugin).to receive(:require) { raise LoadError }
20
+
13
21
  expect {
14
22
  plugin.load!
15
23
  }.to output(/Unable to load plugin tty-console./).to_stdout
16
24
  end
17
25
 
18
26
  it 'fails to require the gem' do
19
- allow(Kernel).to receive(:require) { raise StandardError }
27
+ plugin = TTY::Plugin.new('tty-console', gem)
28
+ allow(plugin).to receive(:require) { raise StandardError }
29
+
20
30
  expect {
21
31
  plugin.load!
22
- }.to output(/Unable to load plugin tty-console./).to_stdout
32
+ }.to output(/require 'tty-console' failed with StandardError\n/).to_stdout
23
33
  end
24
34
  end
@@ -4,15 +4,12 @@ require 'spec_helper'
4
4
 
5
5
  describe TTY::Plugin, '#new' do
6
6
  let(:gem) { Gem::Specification.new('tty-console', '3.1.3')}
7
- let(:name) { 'console'}
8
7
 
9
- subject(:plugin) { described_class.new(name, gem) }
8
+ subject(:plugin) { described_class.new('tty-console', gem) }
10
9
 
11
- it { expect(plugin.name).to eq(name) }
10
+ it { expect(plugin.name).to eq('tty-console') }
12
11
 
13
12
  it { expect(plugin.gem).to eq(gem) }
14
13
 
15
- it { expect(plugin.enabled).to eq(false) }
16
-
17
- it { expect(plugin.gem_name).to eq("tty-#{name}") }
14
+ it { expect(plugin.enabled?).to eq(false) }
18
15
  end
@@ -5,18 +5,12 @@ require 'spec_helper'
5
5
  describe TTY do
6
6
  let(:object) { described_class }
7
7
 
8
- it { expect(object.terminal).to be_instance_of(TTY::Terminal) }
9
-
10
- #it { expect(object.shell).to be_instance_of(TTY::Shell) }
11
-
12
- it { expect(object.system).to be(TTY::System) }
13
-
14
8
  it { expect(object.plugins).to be_instance_of(TTY::Plugins) }
15
9
 
16
10
  context 'when module' do
17
11
  it 'decorates class' do
18
12
  klass = Class.new { include TTY }
19
- expect(klass).to respond_to(:terminal)
13
+ expect(klass).to respond_to(:plugins)
20
14
  end
21
15
  end
22
16
  end # TTY