derelict 0.2.0.travis.72 → 0.2.0.travis.77

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OGRkMzkzYzQ2NWExYzViYWJlMjg2MjQxOWU5YTk3ZjM3ZjIyMTYzMQ==
4
+ NjhhY2Y5NzUyYzBkYzhmYjAyNjcwMzRhNTcxYmNlZGM0ZTUxYWY3Yw==
5
5
  data.tar.gz: !binary |-
6
- ZGY5NzAwZTcxMDI0YTk4M2UwNTAwZTJjYzBkZmU2MGY1MTEwODVhOA==
6
+ YTcxMzJmOGE4OGRkOGI0MzliYmI4MmM4ZTllOGU0NWRlOWExZDNmNw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- YzYwZGMxOWQ0MTgyMDBkZmY5ZDJiYjkzODcyZTY3ZWYxYTE5NDhiNjM4NTdl
10
- MGIyMGM4ZGQ4MjBlYTVkOWI1M2ZiNzdmMTdkOTU2M2QwN2E2ZDljMjkyYjc3
11
- Nzk4ZDZjMThhN2VlOGIyNTMxMjhlYWNkMGQ2ZDkzNjEyYTg1NWQ=
9
+ N2RjNTJhNWRjZGY0MzY1NjgxOWIwMDdkOTlhOTY2ZDJkZmMwNzliNDNkNDFk
10
+ ZDRmNjVjZjIwY2VhNWUzODBjZTg0ODZmYjVjYjJjNjdiNTUyZGY4MDRmNmY5
11
+ NGZmMWE0N2QzYjE1ZjViOWZlM2JmNzUwYzAyN2VmZTZjMDUwYjU=
12
12
  data.tar.gz: !binary |-
13
- OWU2ZjYyZTZlM2VjMjNiMDg2ZjQwYzAyMjE0MmRlYmM1ODUxNTdjYzM1MTYz
14
- M2I2YmRkZTc2ZmY2Njg2ZWEwYjE2Mzc5ZTFmOTY1NmNiY2FkZDY1ZmU4YmVm
15
- NjMwMGViZGI2Y2ZlZmEyNDgyYzg4OGU5YzNhOTc5NmI4YmNkYTk=
13
+ OGNlZGZhNmYyNDI0NGUzYzc0Y2NlNDc4MTgyNDYxNjlkZTg5ZmY5NmY2NWIz
14
+ ZjRkZWM4YzdhMDQ3Nzc0ODM0NWNmMTZmZWI3ZDE2MDZlN2E2YzRmMTg5ZWRl
15
+ ZTBhY2ZiZWE2NjY4MmY3NGQxZTM1NTBhMjRmZWM5YmUxM2M5MWI=
data/derelict.gemspec CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
35
35
  spec.add_runtime_dependency "log4r"
36
36
  spec.add_runtime_dependency "memoist"
37
37
  spec.add_runtime_dependency "shell-executer"
38
+ spec.add_runtime_dependency "mime-types", "<2.0" # for coveralls 1.8
38
39
 
39
40
 
40
41
  version_major = RbConfig::CONFIG["MAJOR"].to_i
@@ -92,6 +92,12 @@ module Derelict
92
92
  Derelict::Connection.new(self, path).validate!
93
93
  end
94
94
 
95
+ # Initializes a plugin manager for use with this instance
96
+ def plugins
97
+ logger.info "Creating plugin manager for #{description}"
98
+ Derelict::Plugin::Manager.new(self)
99
+ end
100
+
95
101
  # Provides a description of this Instance
96
102
  #
97
103
  # Mainly used for log messages.
@@ -0,0 +1,16 @@
1
+ module Derelict
2
+ class Parser
3
+ class PluginList
4
+ # The plugin list wasn't in the expected format, can't be parsed
5
+ class InvalidFormat < Derelict::Exception
6
+ include Derelict::Exception::OptionalReason
7
+
8
+ private
9
+ # Retrieves the default error message
10
+ def default_message
11
+ "Output from 'vagrant plugin list' was in an unexpected format"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,47 @@
1
+ module Derelict
2
+ # Parses the output of "vagrant plugin list"
3
+ class Parser::PluginList < Parser
4
+ autoload :InvalidFormat, "derelict/parser/plugin_list/invalid_format"
5
+
6
+ # Include "memoize" class method to memoize methods
7
+ extend Memoist
8
+
9
+ # Regexp to parse a plugin line into a plugin name and version
10
+ #
11
+ # Capture groups:
12
+ #
13
+ # 1. Plugin name, as listed in the output
14
+ # 2. Currently installed version (without surrounding brackets)
15
+ PARSE_PLUGIN = %r[
16
+ ^(.*) # Plugin name starts at the start of the line.
17
+ \ # Version is separated by a space character,
18
+ \(([0-9\-_.]+)\) # contains version string surrounded by brackets
19
+ $ # at the end of the line.
20
+ ]x # Ignore whitespace to allow these comments.
21
+
22
+ # Retrieves a Set containing all the plugins from the output
23
+ def plugins
24
+ plugin_lines.map {|l| parse_line l.match(PARSE_PLUGIN) }.to_set
25
+ end
26
+
27
+ # Provides a description of this Parser
28
+ #
29
+ # Mainly used for log messages.
30
+ def description
31
+ "Derelict::Parser::PluginList instance"
32
+ end
33
+
34
+ private
35
+ # Retrieves an array of the plugin lines in the output
36
+ def plugin_lines
37
+ return [] if output.match /no plugins installed/i
38
+ output.lines
39
+ end
40
+
41
+ # Parses a single line of the output into a Plugin object
42
+ def parse_line(match)
43
+ raise InvalidFormat.new "Couldn't parse plugin" if match.nil?
44
+ Derelict::Plugin.new *match.captures[0..1]
45
+ end
46
+ end
47
+ end
@@ -1,8 +1,9 @@
1
1
  module Derelict
2
2
  # Base class for parsers, which extract data from command output
3
3
  class Parser
4
- autoload :Status, "derelict/parser/status"
5
- autoload :Version, "derelict/parser/version"
4
+ autoload :PluginList, "derelict/parser/plugin_list"
5
+ autoload :Status, "derelict/parser/status"
6
+ autoload :Version, "derelict/parser/version"
6
7
 
7
8
  # Include "logger" method to get a logger for this class
8
9
  include Utils::Logger
@@ -0,0 +1,110 @@
1
+ module Derelict
2
+ class Plugin
3
+ # A class that handles managing plugins for a Vagrant instance
4
+ class Manager
5
+ # Include "memoize" class method to memoize methods
6
+ extend Memoist
7
+
8
+ # Include "logger" method to get a logger for this class
9
+ include Utils::Logger
10
+
11
+ attr_reader :instance
12
+
13
+ # Initializes a Manager for use with a particular instance
14
+ #
15
+ # * instance: The Derelict::Instance which will have its
16
+ # plugins managed by this Manager
17
+ def initialize(instance)
18
+ @instance = instance
19
+ logger.debug "Successfully initialized #{description}"
20
+ end
21
+
22
+ # Retrieves the Set of currently installed plugins
23
+ def list
24
+ logger.info "Retrieving Vagrant plugin list for #{description}"
25
+ output = instance.execute!(:plugin, "list").stdout
26
+ Derelict::Parser::PluginList.new(output).plugins
27
+ end
28
+ memoize :list
29
+
30
+ # Determines whether a particular plugin is installed
31
+ #
32
+ # * plugin_name: Name of the plugin to look for (as a string)
33
+ def installed?(plugin_name)
34
+ fetch plugin_name; true
35
+ rescue Plugin::NotFound
36
+ false
37
+ end
38
+
39
+ # Installs a plugin (optionally a particular version)
40
+ #
41
+ # If no version is specified, the latest stable version is used
42
+ # by Vagrant.
43
+ #
44
+ # * plugin_name: Name of the plugin to install (as a string)
45
+ # * options: Hash of options, valid keys:
46
+ # * version: Particular version to install (optional,
47
+ # latest version will be installed if omitted)
48
+ # * log: Whether to log the output (optional, defaults
49
+ # to false)
50
+ def install(plugin_name, options = {})
51
+ options = {:log => false, :version => nil}.merge(options)
52
+ logger.info "Installing plugin '#{plugin_name}' using #{description}"
53
+
54
+ version = options[:version]
55
+ command = [:plugin, "install", plugin_name]
56
+ command.concat ["--plugin-version", version] unless version.nil?
57
+
58
+ log_block = options[:log] ? shell_log_block : nil
59
+ instance.execute! *command, &log_block
60
+ end
61
+
62
+ # Uninstalls a particular Vagrant plugin
63
+ #
64
+ # * plugin_name: Name of the plugin to uninstall (as a string)
65
+ def uninstall(plugin_name, options = {})
66
+ options = {:log => false}.merge(options)
67
+ logger.info "Uninstalling plugin '#{plugin_name}' using #{description}"
68
+
69
+ log_block = options[:log] ? shell_log_block : nil
70
+ instance.execute! :plugin, "uninstall", plugin_name, &log_block
71
+ end
72
+
73
+ # Updates a particular Vagrant plugin
74
+ #
75
+ # * plugin_name: Name of the plugin to update (as a string)
76
+ def update(plugin_name, options = {})
77
+ options = {:log => false}.merge(options)
78
+ logger.info "Updating plugin '#{plugin_name}' using #{description}"
79
+
80
+ log_block = options[:log] ? shell_log_block : nil
81
+ instance.execute! :plugin, "update", plugin_name, &log_block
82
+ end
83
+
84
+ # Retrieves a plugin with a particular name
85
+ #
86
+ # * plugin_name: Name of the plugin to look for (as a string)
87
+ def fetch(plugin_name)
88
+ list.find {|plugin| plugin.name == plugin_name}.tap do |plugin|
89
+ raise Plugin::NotFound.new plugin_name if plugin.nil?
90
+ end
91
+ end
92
+
93
+ # Provides a description of this Connection
94
+ #
95
+ # Mainly used for log messages.
96
+ def description
97
+ "Derelict::Plugin::Manager for #{instance.description}"
98
+ end
99
+
100
+ private
101
+ # A block that can be passed to #execute to log the output
102
+ def shell_log_block
103
+ Proc.new do |line|
104
+ logger(:type => :external).info line
105
+ end
106
+ end
107
+ memoize :shell_log_block
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,14 @@
1
+ module Derelict
2
+ class Plugin
3
+ # A plugin that isn't currently installed has been retrieved
4
+ class NotFound < Derelict::Exception
5
+ # Initializes a new instance of this exception, for a plugin name
6
+ #
7
+ # * plugin_name: The name of the plugin that this exception
8
+ # relates to
9
+ def initialize(plugin_name)
10
+ super "Plugin '#{plugin_name}' is not currently installed"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ module Derelict
2
+ # Represents an individual Vagrant plugin at a particular version
3
+ class Plugin
4
+ autoload :Manager, "derelict/plugin/manager"
5
+ autoload :NotFound, "derelict/plugin/not_found"
6
+
7
+ attr_reader :name, :version
8
+
9
+ # Initializes a plugin with a particular name and version
10
+ #
11
+ # * name: The name of the plugin represented by this object
12
+ # * version: The version of the plugin represented by this object
13
+ def initialize(name, version)
14
+ @name = name
15
+ @version = version
16
+ end
17
+
18
+ # Ensure equivalent Plugins are equal to this one
19
+ def ==(other)
20
+ other.name == name and other.version == version
21
+ end
22
+ alias_method :eql?, :==
23
+
24
+ # Make equivalent Plugins hash to the same value
25
+ def hash
26
+ name.hash ^ version.hash
27
+ end
28
+ end
29
+ end
data/lib/derelict.rb CHANGED
@@ -13,6 +13,7 @@ module Derelict
13
13
  autoload :Exception, "derelict/exception"
14
14
  autoload :Instance, "derelict/instance"
15
15
  autoload :Parser, "derelict/parser"
16
+ autoload :Plugin, "derelict/plugin"
16
17
  autoload :Utils, "derelict/utils"
17
18
  autoload :VirtualMachine, "derelict/virtual_machine"
18
19
 
@@ -25,6 +25,12 @@ describe Derelict::Instance do
25
25
  end
26
26
  end
27
27
 
28
+ describe "#plugins" do
29
+ subject { instance.plugins }
30
+ it { should be_a Derelict::Plugin::Manager }
31
+ its(:instance) { should be instance }
32
+ end
33
+
28
34
  context "with path parameter" do
29
35
  let(:path) { "/foo/bar" }
30
36
 
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Parser::PluginList::InvalidFormat do
4
+ it "is autoloaded" do
5
+ should be_a Derelict::Parser::PluginList::InvalidFormat
6
+ end
7
+
8
+ context "when using default reason" do
9
+ its(:message) { should eq "Output from 'vagrant plugin list' was in an unexpected format" }
10
+ end
11
+
12
+ context "when using custom reason" do
13
+ subject { Derelict::Parser::PluginList::InvalidFormat.new "reason" }
14
+ its(:message) { should eq "Output from 'vagrant plugin list' was in an unexpected format: reason" }
15
+ end
16
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Parser::PluginList do
4
+ subject { Derelict::Parser::PluginList.new output }
5
+ let(:output) { nil }
6
+
7
+ it "is autoloaded" do
8
+ should be_a Derelict::Parser::PluginList
9
+ end
10
+
11
+ context "with valid output" do
12
+ let(:output) {
13
+ <<-END.gsub /^ +/, ""
14
+ foo (2.3.4)
15
+ bar (1.2.3)
16
+ END
17
+ }
18
+
19
+ describe "#plugins" do
20
+ subject { Derelict::Parser::PluginList.new(output).plugins }
21
+ let(:foo) { Derelict::Plugin.new "foo", "2.3.4" }
22
+ let(:bar) { Derelict::Plugin.new "bar", "1.2.3" }
23
+ it { should eq Set[foo, bar] }
24
+
25
+ include_context "logged messages"
26
+ let(:expected_logs) {[
27
+ "DEBUG pluginlist: Successfully initialized Derelict::Parser::PluginList instance\n",
28
+ ]}
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,183 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Plugin::Manager do
4
+ let(:instance) { double("instance", :description => "test instance") }
5
+ let(:manager) { Derelict::Plugin::Manager.new instance }
6
+ subject { manager }
7
+
8
+ it "is autoloaded" do
9
+ should be_a Derelict::Plugin::Manager
10
+ end
11
+
12
+ include_context "logged messages"
13
+ let(:expected_logs) {[
14
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n"
15
+ ]}
16
+
17
+ describe "#list" do
18
+ let(:stdout) { "stdout\n" }
19
+ let(:result) { double("result", :stdout => stdout) }
20
+ let(:parser) { double("parser", :plugins => plugins) }
21
+ let(:plugins) { [:foo, :bar] }
22
+
23
+ subject { manager.list }
24
+
25
+ before do
26
+ expect(instance).to receive(:execute!).with(:plugin, "list").and_return(result)
27
+ expect(Derelict::Parser::PluginList).to receive(:new).with(stdout).and_return(parser)
28
+ end
29
+
30
+ it { should be plugins }
31
+
32
+ include_context "logged messages"
33
+ let(:expected_logs) {[
34
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
35
+ " INFO manager: Retrieving Vagrant plugin list for Derelict::Plugin::Manager for test instance\n",
36
+ ]}
37
+ end
38
+
39
+ describe "#installed?" do
40
+ let(:plugin_name) { double("plugin_name") }
41
+ let(:result) { double("result") }
42
+ subject { manager.installed? plugin_name }
43
+
44
+ context "with known plugin" do
45
+ before { expect(manager).to receive(:fetch).with(plugin_name).and_return(result) }
46
+ it { should be true }
47
+ end
48
+
49
+ context "with unknown plugin" do
50
+ before { expect(manager).to receive(:fetch).with(plugin_name).and_raise(Derelict::Plugin::NotFound.new plugin_name) }
51
+ it { should be false }
52
+ end
53
+
54
+ include_context "logged messages"
55
+ let(:expected_logs) {[
56
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
57
+ " INFO manager: Retrieving Vagrant plugin list for Derelict::Plugin::Manager for test instance\n",
58
+ ]}
59
+ end
60
+
61
+ describe "#install" do
62
+ let(:log) { true }
63
+ let(:plugin_name) { double("plugin_name", :to_s => "test plugin") }
64
+ let(:version) { double("version") }
65
+ let(:result) { double("result") }
66
+ subject { manager.install plugin_name, :version => version, :log => log }
67
+
68
+ before do
69
+ expect(instance).to receive(:execute!).with(:plugin, "install", plugin_name, '--plugin-version', version).and_yield("test").and_return(result)
70
+ end
71
+
72
+ it { should be result }
73
+
74
+ context "with logging enabled" do
75
+ include_context "logged messages"
76
+ let(:expected_logs) {[
77
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
78
+ " INFO manager: Installing plugin 'test plugin' using Derelict::Plugin::Manager for test instance\n",
79
+ " INFO external: test\n",
80
+ ]}
81
+ end
82
+
83
+ context "with logging disabled" do
84
+ let(:log) { false }
85
+ include_context "logged messages"
86
+ let(:expected_logs) {[
87
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
88
+ " INFO manager: Installing plugin 'test plugin' using Derelict::Plugin::Manager for test instance\n",
89
+ ]}
90
+ end
91
+ end
92
+
93
+ describe "#uninstall" do
94
+ let(:log) { true }
95
+ let(:plugin_name) { double("plugin_name", :to_s => "test plugin") }
96
+ let(:result) { double("result") }
97
+ subject { manager.uninstall plugin_name, :log => log }
98
+
99
+ before do
100
+ expect(instance).to receive(:execute!).with(:plugin, "uninstall", plugin_name).and_yield("test").and_return(result)
101
+ end
102
+
103
+ it { should be result }
104
+
105
+ context "with logging enabled" do
106
+ include_context "logged messages"
107
+ let(:expected_logs) {[
108
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
109
+ " INFO manager: Uninstalling plugin 'test plugin' using Derelict::Plugin::Manager for test instance\n",
110
+ " INFO external: test\n",
111
+ ]}
112
+ end
113
+
114
+ context "with logging disabled" do
115
+ let(:log) { false }
116
+ include_context "logged messages"
117
+ let(:expected_logs) {[
118
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
119
+ " INFO manager: Uninstalling plugin 'test plugin' using Derelict::Plugin::Manager for test instance\n",
120
+ ]}
121
+ end
122
+ end
123
+
124
+ describe "#update" do
125
+ let(:log) { true }
126
+ let(:plugin_name) { double("plugin_name", :to_s => "test plugin") }
127
+ let(:result) { double("result") }
128
+ subject { manager.update plugin_name, :log => log }
129
+
130
+ before do
131
+ expect(instance).to receive(:execute!).with(:plugin, "update", plugin_name).and_yield("test").and_return(result)
132
+ end
133
+
134
+ it { should be result }
135
+
136
+ context "with logging enabled" do
137
+ include_context "logged messages"
138
+ let(:expected_logs) {[
139
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
140
+ " INFO manager: Updating plugin 'test plugin' using Derelict::Plugin::Manager for test instance\n",
141
+ " INFO external: test\n",
142
+ ]}
143
+ end
144
+
145
+ context "with logging disabled" do
146
+ let(:log) { false }
147
+ include_context "logged messages"
148
+ let(:expected_logs) {[
149
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
150
+ " INFO manager: Updating plugin 'test plugin' using Derelict::Plugin::Manager for test instance\n",
151
+ ]}
152
+ end
153
+ end
154
+
155
+
156
+ describe "#fetch" do
157
+ let(:foo) { double("foo", :name => "foo") }
158
+ let(:bar) { double("bar", :name => "bar") }
159
+ let(:plugins) { [foo, bar] }
160
+
161
+ let(:plugin_name) { double("plugin_name") }
162
+ subject { manager.fetch plugin_name }
163
+ before { expect(manager).to receive(:list).and_return(plugins) }
164
+
165
+ context "with known plugin" do
166
+ let(:plugin_name) { "foo" }
167
+ it { should be foo }
168
+ end
169
+
170
+ context "with unknown plugin" do
171
+ let(:plugin_name) { "qux" }
172
+ it "should raise NotFound" do
173
+ expect { subject }.to raise_error Derelict::Plugin::NotFound
174
+ end
175
+ end
176
+
177
+ include_context "logged messages"
178
+ let(:expected_logs) {[
179
+ "DEBUG manager: Successfully initialized Derelict::Plugin::Manager for test instance\n",
180
+ ]}
181
+ end
182
+
183
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Plugin::NotFound do
4
+ subject { Derelict::Plugin::NotFound.new "test" }
5
+
6
+ it "is autoloaded" do
7
+ should be_a Derelict::Plugin::NotFound
8
+ end
9
+
10
+ its(:message) {
11
+ should eq "Plugin 'test' is not currently installed"
12
+ }
13
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ describe Derelict::Plugin do
4
+ let(:name) { double("name") }
5
+ let(:version) { double("version") }
6
+ let(:plugin) { Derelict::Plugin.new name, version }
7
+ subject { plugin }
8
+
9
+ it "is autoloaded" do
10
+ should be_a Derelict::Plugin
11
+ end
12
+
13
+ its(:name) { should be name }
14
+ its(:version) { should be version }
15
+
16
+ context "when comparing to an equivalent" do
17
+ let(:other) { plugin.dup }
18
+
19
+ it { should eq other }
20
+ its(:hash) { should eq other.hash }
21
+
22
+ specify "#eql?(other) should be true" do
23
+ expect(subject.eql? other).to be true
24
+ end
25
+ end
26
+
27
+ context "when comparing to a non-equivalent" do
28
+ let(:other) { plugin.class.new "not_foo", "1.0" }
29
+
30
+ it { should_not eq other }
31
+ its(:hash) { should_not eq other.hash }
32
+
33
+ specify "#eql?(other) should be false" do
34
+ expect(subject.eql? other).to be false
35
+ end
36
+ end
37
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: derelict
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.travis.72
4
+ version: 0.2.0.travis.77
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brad Feehan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-25 00:00:00.000000000 Z
11
+ date: 2013-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: log4r
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mime-types
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - <
60
+ - !ruby/object:Gem::Version
61
+ version: '2.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - <
67
+ - !ruby/object:Gem::Version
68
+ version: '2.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -188,10 +202,15 @@ files:
188
202
  - lib/derelict/instance/non_directory.rb
189
203
  - lib/derelict/instance/not_found.rb
190
204
  - lib/derelict/parser.rb
205
+ - lib/derelict/parser/plugin_list.rb
206
+ - lib/derelict/parser/plugin_list/invalid_format.rb
191
207
  - lib/derelict/parser/status.rb
192
208
  - lib/derelict/parser/status/invalid_format.rb
193
209
  - lib/derelict/parser/version.rb
194
210
  - lib/derelict/parser/version/invalid_format.rb
211
+ - lib/derelict/plugin.rb
212
+ - lib/derelict/plugin/manager.rb
213
+ - lib/derelict/plugin/not_found.rb
195
214
  - lib/derelict/utils.rb
196
215
  - lib/derelict/utils/logger.rb
197
216
  - lib/derelict/utils/logger/array_outputter.rb
@@ -213,11 +232,16 @@ files:
213
232
  - spec/derelict/instance/non_directory_spec.rb
214
233
  - spec/derelict/instance/not_found_spec.rb
215
234
  - spec/derelict/instance_spec.rb
235
+ - spec/derelict/parser/plugin_list/invalid_format_spec.rb
236
+ - spec/derelict/parser/plugin_list_spec.rb
216
237
  - spec/derelict/parser/status/invalid_format_spec.rb
217
238
  - spec/derelict/parser/status_spec.rb
218
239
  - spec/derelict/parser/version/invalid_format_spec.rb
219
240
  - spec/derelict/parser/version_spec.rb
220
241
  - spec/derelict/parser_spec.rb
242
+ - spec/derelict/plugin/manager_spec.rb
243
+ - spec/derelict/plugin/not_found_spec.rb
244
+ - spec/derelict/plugin_spec.rb
221
245
  - spec/derelict/utils/logger/array_outputter_spec.rb
222
246
  - spec/derelict/utils/logger/invalid_type_spec.rb
223
247
  - spec/derelict/utils/logger/raw_formatter_spec.rb
@@ -265,11 +289,16 @@ test_files:
265
289
  - spec/derelict/instance/non_directory_spec.rb
266
290
  - spec/derelict/instance/not_found_spec.rb
267
291
  - spec/derelict/instance_spec.rb
292
+ - spec/derelict/parser/plugin_list/invalid_format_spec.rb
293
+ - spec/derelict/parser/plugin_list_spec.rb
268
294
  - spec/derelict/parser/status/invalid_format_spec.rb
269
295
  - spec/derelict/parser/status_spec.rb
270
296
  - spec/derelict/parser/version/invalid_format_spec.rb
271
297
  - spec/derelict/parser/version_spec.rb
272
298
  - spec/derelict/parser_spec.rb
299
+ - spec/derelict/plugin/manager_spec.rb
300
+ - spec/derelict/plugin/not_found_spec.rb
301
+ - spec/derelict/plugin_spec.rb
273
302
  - spec/derelict/utils/logger/array_outputter_spec.rb
274
303
  - spec/derelict/utils/logger/invalid_type_spec.rb
275
304
  - spec/derelict/utils/logger/raw_formatter_spec.rb