busser 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,42 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'busser/thor'
20
+ require 'busser/command/plugin'
21
+ require 'busser/command/setup'
22
+ require 'busser/command/suite'
23
+ require 'busser/command/test'
24
+
25
+ module Busser
26
+
27
+ # Main command line interface class which delegates to subcommands.
28
+ #
29
+ # @author Fletcher Nichol <fnichol@nichol.ca>
30
+ #
31
+ class CLI < Thor::Base
32
+
33
+ register Busser::Command::Setup, "setup",
34
+ "setup", "Creates a Busser home"
35
+ register Busser::Command::Plugin, "plugin",
36
+ "plugin SUBCOMMAND", "Plugin subcommands"
37
+ register Busser::Command::Suite, "suite",
38
+ "suite SUBCOMMAND", "Suite subcommands"
39
+ register Busser::Command::Test, "test",
40
+ "test [PLUGIN ...]", "Runs test suites"
41
+ end
42
+ end
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'busser/thor'
20
+ require 'busser/command/plugin_install'
21
+ require 'busser/command/plugin_list'
22
+
23
+ module Busser
24
+
25
+ module Command
26
+
27
+ # Plugin commands.
28
+ #
29
+ # @author Fletcher Nichol <fnichol@nichol.ca>
30
+ #
31
+ class Plugin < Busser::Thor::Base
32
+
33
+ register Busser::Command::PluginInstall, "install",
34
+ "install PLUGIN [PLUGIN ...]", "Installs one or more plugins"
35
+ register Busser::Command::PluginList, "list",
36
+ "list", "Lists installed plugins"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,95 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'rubygems/dependency_installer'
20
+ require 'busser/thor'
21
+
22
+ module Busser
23
+
24
+ module Command
25
+
26
+ # Plugin install command.
27
+ #
28
+ # @author Fletcher Nichol <fnichol@nichol.ca>
29
+ #
30
+ class PluginInstall < Busser::Thor::BaseGroup
31
+
32
+ argument :plugins, :type => :array
33
+
34
+ def install_all
35
+ silence_gem_ui!
36
+ plugins.each { |plugin| install(plugin) }
37
+ end
38
+
39
+ private
40
+
41
+ def install(plugin)
42
+ install_gem(plugin)
43
+ end
44
+
45
+ def install_gem(plugin)
46
+ name, version = plugin.split("@")
47
+
48
+ if gem_installed?(name, version)
49
+ info "#{plugin} plugin already installed"
50
+ else
51
+ spec = dep_installer.install(new_dep(name, version)).first
52
+ info "Plugin #{plugin} installed (version #{spec.version})"
53
+ end
54
+ end
55
+
56
+ def gem_installed?(name, version)
57
+ installed = Array(Gem::Specification.find_all_by_name(name, version))
58
+ version = latest_version(name) if version.nil?
59
+
60
+ installed.find { |spec| spec.version.to_s == version }
61
+ end
62
+
63
+ def latest_version(name)
64
+ available_gems = dep_installer.find_gems_with_sources(new_dep(name))
65
+
66
+ spec, source = if available_gems.respond_to?(:last)
67
+ # DependencyInstaller sorts the results such that the last one is
68
+ # always the one it considers best.
69
+ spec_with_source = available_gems.last
70
+ spec_with_source && spec_with_source
71
+ else
72
+ # Rubygems 2.0 returns a Gem::Available set, which is a
73
+ # collection of AvailableSet::Tuple structs
74
+ available_gems.pick_best!
75
+ best_gem = available_gems.set.first
76
+ best_gem && [best_gem.spec, best_gem.source]
77
+ end
78
+
79
+ spec && spec.version && spec.version.to_s
80
+ end
81
+
82
+ def silence_gem_ui!
83
+ Gem::DefaultUserInteraction.ui = Gem::SilentUI.new
84
+ end
85
+
86
+ def dep_installer
87
+ Gem::DependencyInstaller.new
88
+ end
89
+
90
+ def new_dep(name, version = nil)
91
+ Gem::Dependency.new(name, version)
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,50 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'busser/plugin'
20
+ require 'busser/thor'
21
+
22
+ module Busser
23
+
24
+ module Command
25
+
26
+ # Plugin list command.
27
+ #
28
+ # @author Fletcher Nichol <fnichol@nichol.ca>
29
+ #
30
+ class PluginList < Busser::Thor::BaseGroup
31
+
32
+ def list
33
+ if plugin_data.empty?
34
+ say "No plugins installed yet"
35
+ else
36
+ print_table([["Plugin", "Version"]] + plugin_data)
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def plugin_data
43
+ @plugin_data ||= Busser::Plugin.runner_plugins.map do |path|
44
+ spec = Busser::Plugin.gem_from_path(path)
45
+ [File.basename(path), (spec && spec.version)]
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,93 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'busser/thor'
20
+ require 'busser/plugin'
21
+
22
+ module Busser
23
+
24
+ module Command
25
+
26
+ # Setup command.
27
+ #
28
+ # @author Fletcher Nichol <fnichol@nichol.ca>
29
+ #
30
+ class Setup < Busser::Thor::BaseGroup
31
+
32
+ def perform
33
+ banner "Setting up Busser"
34
+ create_busser_root
35
+ generate_busser_binstub
36
+ end
37
+
38
+ private
39
+
40
+ def create_busser_root
41
+ info "Creating BUSSER_ROOT in #{root_path}"
42
+ empty_directory(root_path, :verbose => false)
43
+ end
44
+
45
+ def generate_busser_binstub
46
+ binstub = root_path + "bin/busser"
47
+
48
+ info "Creating busser binstub"
49
+ create_file(binstub, :verbose => false) do
50
+ <<-BUSSER_BINSTUB.gsub(/^ {12}/, '')
51
+ #!/usr/bin/env bash
52
+ #
53
+ # This file was generated by Busser.
54
+ #
55
+ # The application 'busser' is installed as part of a gem, and
56
+ # this file is here to facilitate running it.
57
+ #
58
+
59
+ # Get the directory where this ruby is. This will also resolve
60
+ # any symlinks in the directory/script, so it will be the fully
61
+ # resolved path.
62
+ SOURCE="#{ruby_bin}"
63
+ while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
64
+ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
65
+
66
+ # Export gem paths so that we use the isolated gems.
67
+ export GEM_HOME="#{gem_home}"
68
+ export GEM_PATH="${GEM_HOME}"
69
+
70
+ # Unset RUBYOPT, we don't want this bleeding into our runtime.
71
+ unset RUBYOPT GEMRC
72
+
73
+ # Call the actual Busser bin with our arguments
74
+ exec "${DIR}/ruby" "${DIR}/busser" "$@"
75
+ BUSSER_BINSTUB
76
+ end
77
+ chmod(binstub, 0755, :verbose => false)
78
+ end
79
+
80
+ def ruby_bin
81
+ if bindir = RbConfig::CONFIG["bindir"]
82
+ File.join(bindir, "ruby")
83
+ else
84
+ "ruby"
85
+ end
86
+ end
87
+
88
+ def gem_home
89
+ Gem.paths.home
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'busser/thor'
20
+ require 'busser/command/suite_cleanup'
21
+ require 'busser/command/suite_path'
22
+
23
+ module Busser
24
+
25
+ module Command
26
+
27
+ # Suite commands.
28
+ #
29
+ # @author Fletcher Nichol <fnichol@nichol.ca>
30
+ #
31
+ class Suite < Busser::Thor::Base
32
+
33
+ register Busser::Command::SuiteCleanup, "cleanup",
34
+ "cleanup", "Cleans up test suite directories"
35
+ register Busser::Command::SuitePath, "path",
36
+ "path [<plugin_name>]", "Displays the directory for suite tests"
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,43 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'busser/thor'
20
+
21
+ module Busser
22
+
23
+ module Command
24
+
25
+ # Suite cleanup command.
26
+ #
27
+ # @author Fletcher Nichol <fnichol@nichol.ca>
28
+ #
29
+ class SuiteCleanup < Busser::Thor::BaseGroup
30
+
31
+ def cleanup
32
+ if suite_path.directory?
33
+ Pathname.glob(suite_path + "*").each do |dir|
34
+ info "Removing #{dir}"
35
+ dir.rmtree
36
+ end
37
+ else
38
+ info "Suite path directory #{suite_path} does not exist, skipping."
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2013, Fletcher Nichol
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require 'busser/thor'
20
+
21
+ module Busser
22
+
23
+ module Command
24
+
25
+ # Suite path command.
26
+ #
27
+ # @author Fletcher Nichol <fnichol@nichol.ca>
28
+ #
29
+ class SuitePath < Busser::Thor::BaseGroup
30
+
31
+ argument :suite_name, :required => false
32
+
33
+ def path
34
+ say suite_path(suite_name)
35
+ end
36
+ end
37
+ end
38
+ end