build-tool 0.0.3 → 0.1.0
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.
- data.tar.gz.sig +0 -0
- data/History.txt +28 -1
- data/Manifest.txt +91 -52
- data/README.txt +63 -0
- data/Rakefile +20 -23
- data/bin/build-tool +53 -0
- data/lib/build-tool.rb +7 -0
- data/lib/build-tool/GUI.rb +360 -0
- data/lib/build-tool/application.rb +84 -0
- data/lib/build-tool/build-system/autoconf.rb +60 -0
- data/lib/build-tool/build-system/base.rb +142 -0
- data/lib/build-tool/build-system/cmake.rb +119 -0
- data/lib/build-tool/build-system/custom.rb +115 -0
- data/lib/build-tool/build-system/qt.rb +113 -0
- data/lib/build-tool/cfg/lexer.rb +558 -0
- data/lib/build-tool/cfg/lexer.rex +248 -0
- data/lib/build-tool/cfg/lexer_base.rb +82 -0
- data/lib/build-tool/cfg/node.rb +94 -0
- data/lib/build-tool/cfg/parser.rb +871 -0
- data/lib/build-tool/cfg/parser.y +279 -0
- data/lib/build-tool/cfg/visitor.rb +471 -0
- data/lib/build-tool/commands.rb +639 -0
- data/lib/build-tool/commands/build.rb +120 -0
- data/lib/build-tool/commands/configure.rb +73 -0
- data/lib/build-tool/commands/ctags.rb +46 -0
- data/lib/build-tool/commands/environments.rb +29 -0
- data/lib/build-tool/commands/environments/list.rb +37 -0
- data/lib/build-tool/commands/environments/set.rb +33 -0
- data/lib/build-tool/commands/fetch.rb +50 -0
- data/lib/build-tool/commands/files.rb +73 -0
- data/lib/build-tool/commands/help.rb +22 -0
- data/lib/build-tool/commands/info.rb +48 -0
- data/lib/build-tool/commands/install.rb +56 -0
- data/lib/build-tool/commands/modules.rb +29 -0
- data/lib/build-tool/commands/modules/info.rb +75 -0
- data/lib/build-tool/commands/modules/list.rb +49 -0
- data/lib/build-tool/commands/modules/shell.rb +40 -0
- data/lib/build-tool/commands/rebase.rb +46 -0
- data/lib/build-tool/commands/recipes.rb +32 -0
- data/lib/build-tool/commands/recipes/info.rb +46 -0
- data/lib/build-tool/commands/recipes/install.rb +184 -0
- data/lib/build-tool/commands/recipes/list.rb +33 -0
- data/lib/build-tool/configuration.rb +115 -0
- data/lib/build-tool/environment.rb +119 -0
- data/lib/build-tool/errors.rb +9 -0
- data/lib/build-tool/module.rb +366 -0
- data/lib/build-tool/pluginbase.rb +43 -0
- data/lib/build-tool/recipe.rb +180 -0
- data/lib/build-tool/repository.rb +59 -0
- data/lib/build-tool/server.rb +43 -0
- data/lib/build-tool/singleton.rb +50 -0
- data/lib/build-tool/sshkey.rb +22 -0
- data/lib/build-tool/vcs/base.rb +105 -0
- data/lib/build-tool/vcs/git-svn.rb +154 -0
- data/lib/build-tool/vcs/git.rb +187 -0
- data/lib/build-tool/vcs/svn.rb +136 -0
- data/lib/mj/logging.rb +31 -0
- data/lib/mj/tools/ssh.rb +64 -0
- data/lib/{kde-build → mj/tools}/subprocess.rb +21 -16
- data/lib/mj/visitor.rb +21 -0
- data/recipes/kde/files/finish_installation.sh +16 -0
- data/recipes/kde/files/kde4.desktop +22 -0
- data/recipes/kde/files/xsession +89 -0
- data/recipes/kde/info.yaml +10 -0
- data/recipes/kde/recipe +585 -0
- data/recipes/kde/recipe-local +90 -0
- data/recipes/kde/settings.yaml +52 -0
- data/recipes/kde43/info.yaml +10 -0
- data/recipes/kde43/recipe +256 -0
- data/recipes/kde43/recipe-local +90 -0
- data/recipes/kde43/settings.yaml +32 -0
- data/recipes/kdeqt4.6/custom/qt/qtscriptgenerator/compile.sh +77 -0
- data/recipes/kdeqt4.6/custom/qt/qtscriptgenerator/configure.sh +70 -0
- data/recipes/kdeqt4.6/custom/qt/qtscriptgenerator/install.sh +39 -0
- data/recipes/kdeqt4.6/info.yaml +7 -0
- data/recipes/kdeqt4.6/recipe +155 -0
- data/recipes/kdeqt4.6/recipe-local +30 -0
- data/recipes/kdeqt4.6/settings.yaml +27 -0
- data/tags +745 -0
- data/tasks/genfiles.rake +28 -0
- data/tasks/rdoc.rake +34 -0
- data/tasks/rspec.rake +21 -0
- data/test.rb +28 -0
- data/test/commands/test_build.rb +29 -0
- data/test/test_build_system.rb +98 -0
- data/test/test_cli.rb +61 -0
- data/test/test_command.rb +175 -0
- data/test/test_configuration_parser.rb +542 -0
- data/test/test_environment.rb +82 -0
- data/test/test_helper.rb +39 -7
- data/test/test_module.rb +158 -0
- data/test/test_repository.rb +75 -0
- data/test/test_singleton.rb +51 -0
- data/test/test_ssh_key.rb +14 -0
- data/test/test_svn_parser.rb +28 -0
- data/test/test_vcs.rb +33 -0
- metadata +139 -90
- metadata.gz.sig +0 -0
- data/PostInstall.txt +0 -3
- data/TODO +0 -2
- data/bin/kde-build.rb +0 -21
- data/config/website.yml +0 -2
- data/config/website.yml.sample +0 -2
- data/lib/kde-build.rb +0 -18
- data/lib/kde-build/application.rb +0 -270
- data/lib/kde-build/build_system.rb +0 -28
- data/lib/kde-build/build_system/autoconf.rb +0 -108
- data/lib/kde-build/build_system/base.rb +0 -139
- data/lib/kde-build/build_system/cmake.rb +0 -94
- data/lib/kde-build/build_system/qtcopy.rb +0 -127
- data/lib/kde-build/command.rb +0 -42
- data/lib/kde-build/command/build.rb +0 -106
- data/lib/kde-build/command/compile.rb +0 -39
- data/lib/kde-build/command/configure.rb +0 -48
- data/lib/kde-build/command/ctags.rb +0 -41
- data/lib/kde-build/command/fetch.rb +0 -33
- data/lib/kde-build/command/help.rb +0 -71
- data/lib/kde-build/command/info.rb +0 -45
- data/lib/kde-build/command/install.rb +0 -39
- data/lib/kde-build/command/module_based.rb +0 -44
- data/lib/kde-build/command/rebase.rb +0 -50
- data/lib/kde-build/command/version.rb +0 -43
- data/lib/kde-build/configuration.rb +0 -209
- data/lib/kde-build/exception.rb +0 -6
- data/lib/kde-build/metaaid.rb +0 -18
- data/lib/kde-build/module.rb +0 -227
- data/lib/kde-build/module_configuration.rb +0 -107
- data/lib/kde-build/moduleregistry.rb +0 -85
- data/lib/kde-build/tools/ctags.rb +0 -59
- data/lib/kde-build/tools/logging.rb +0 -49
- data/lib/kde-build/tools/make.rb +0 -58
- data/lib/kde-build/tools/ssh.rb +0 -47
- data/lib/kde-build/vcs.rb +0 -28
- data/lib/kde-build/vcs/base.rb +0 -85
- data/lib/kde-build/vcs/git-svn.rb +0 -139
- data/lib/kde-build/vcs/git.rb +0 -121
- data/lib/kde-build/vcs/svn.rb +0 -102
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/script/txt2html +0 -71
- data/test.yaml.tmpl +0 -632
- data/test/test_kde-build.rb +0 -11
- data/test/test_vcs_svn.rb +0 -44
- data/website/index.html +0 -84
- data/website/index.txt +0 -59
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -159
- data/website/template.html.erb +0 -50
data.tar.gz.sig
ADDED
Binary file
|
data/History.txt
CHANGED
@@ -1,4 +1,31 @@
|
|
1
|
-
== 0.0
|
1
|
+
== 0.1.0 2009-10-08
|
2
|
+
* Major rewrite
|
3
|
+
* Substitute the yaml format for a tailormade file format with
|
4
|
+
handmade lexer and parser
|
5
|
+
* This release is a major backstep in case of functionality but it is
|
6
|
+
usable for everyday use.
|
7
|
+
|
8
|
+
== 0.0.3 2009-07-07
|
9
|
+
* New commands:
|
10
|
+
* ctags - Create tags file for module(s)
|
11
|
+
* compile - Just compile the module(s)
|
12
|
+
* configure - Just configure the module(s)
|
13
|
+
* install - install the module(s)
|
14
|
+
* fetch - Only fetch remote changes. Do not update only if vcs supports
|
15
|
+
it.
|
16
|
+
* rebase - Rebase the checkout against already fetched remote changes.
|
17
|
+
This command will not fetch.
|
18
|
+
* info - Print out some usefule information about a module.
|
19
|
+
* Example Config File
|
20
|
+
* Set PKG_CONFIG_PATH
|
21
|
+
* Fix lensfun receipt
|
22
|
+
* Fix some packages and orders
|
23
|
+
* General Bugfixing
|
24
|
+
* Fix subversion repository initialization.
|
25
|
+
* Improve the documentation strings
|
26
|
+
|
27
|
+
|
28
|
+
== 0.0.2 2009-06-14
|
2
29
|
* Improved example configuration file
|
3
30
|
* Checkout the 4.5 version by default. Not trunk.
|
4
31
|
* Some bugfixes
|
data/Manifest.txt
CHANGED
@@ -1,56 +1,95 @@
|
|
1
1
|
History.txt
|
2
2
|
Manifest.txt
|
3
|
-
|
3
|
+
README.txt
|
4
4
|
Rakefile
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
lib/
|
10
|
-
lib/
|
11
|
-
lib/
|
12
|
-
lib/
|
13
|
-
lib/
|
14
|
-
lib/
|
15
|
-
lib/
|
16
|
-
lib/
|
17
|
-
lib/
|
18
|
-
lib/
|
19
|
-
lib/
|
20
|
-
lib/
|
21
|
-
lib/
|
22
|
-
lib/
|
23
|
-
lib/
|
24
|
-
lib/
|
25
|
-
lib/
|
26
|
-
lib/
|
27
|
-
lib/
|
28
|
-
lib/
|
29
|
-
lib/
|
30
|
-
lib/
|
31
|
-
lib/
|
32
|
-
lib/
|
33
|
-
lib/
|
34
|
-
lib/
|
35
|
-
lib/
|
36
|
-
lib/
|
37
|
-
lib/
|
38
|
-
lib/
|
39
|
-
lib/
|
40
|
-
lib/
|
41
|
-
lib/
|
42
|
-
lib/
|
43
|
-
lib/
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
5
|
+
bin/build-tool
|
6
|
+
lib/build-tool.rb
|
7
|
+
lib/build-tool/GUI.rb
|
8
|
+
lib/build-tool/application.rb
|
9
|
+
lib/build-tool/build-system/autoconf.rb
|
10
|
+
lib/build-tool/build-system/base.rb
|
11
|
+
lib/build-tool/build-system/cmake.rb
|
12
|
+
lib/build-tool/build-system/custom.rb
|
13
|
+
lib/build-tool/build-system/qt.rb
|
14
|
+
lib/build-tool/cfg/lexer.rb
|
15
|
+
lib/build-tool/cfg/lexer.rex
|
16
|
+
lib/build-tool/cfg/lexer_base.rb
|
17
|
+
lib/build-tool/cfg/node.rb
|
18
|
+
lib/build-tool/cfg/parser.rb
|
19
|
+
lib/build-tool/cfg/parser.y
|
20
|
+
lib/build-tool/cfg/visitor.rb
|
21
|
+
lib/build-tool/commands.rb
|
22
|
+
lib/build-tool/commands/build.rb
|
23
|
+
lib/build-tool/commands/configure.rb
|
24
|
+
lib/build-tool/commands/ctags.rb
|
25
|
+
lib/build-tool/commands/environments.rb
|
26
|
+
lib/build-tool/commands/environments/list.rb
|
27
|
+
lib/build-tool/commands/environments/set.rb
|
28
|
+
lib/build-tool/commands/fetch.rb
|
29
|
+
lib/build-tool/commands/files.rb
|
30
|
+
lib/build-tool/commands/help.rb
|
31
|
+
lib/build-tool/commands/info.rb
|
32
|
+
lib/build-tool/commands/install.rb
|
33
|
+
lib/build-tool/commands/modules.rb
|
34
|
+
lib/build-tool/commands/modules/info.rb
|
35
|
+
lib/build-tool/commands/modules/list.rb
|
36
|
+
lib/build-tool/commands/modules/shell.rb
|
37
|
+
lib/build-tool/commands/rebase.rb
|
38
|
+
lib/build-tool/commands/recipes.rb
|
39
|
+
lib/build-tool/commands/recipes/info.rb
|
40
|
+
lib/build-tool/commands/recipes/install.rb
|
41
|
+
lib/build-tool/commands/recipes/list.rb
|
42
|
+
lib/build-tool/configuration.rb
|
43
|
+
lib/build-tool/environment.rb
|
44
|
+
lib/build-tool/errors.rb
|
45
|
+
lib/build-tool/module.rb
|
46
|
+
lib/build-tool/pluginbase.rb
|
47
|
+
lib/build-tool/recipe.rb
|
48
|
+
lib/build-tool/repository.rb
|
49
|
+
lib/build-tool/server.rb
|
50
|
+
lib/build-tool/singleton.rb
|
51
|
+
lib/build-tool/sshkey.rb
|
52
|
+
lib/build-tool/vcs/base.rb
|
53
|
+
lib/build-tool/vcs/git-svn.rb
|
54
|
+
lib/build-tool/vcs/git.rb
|
55
|
+
lib/build-tool/vcs/svn.rb
|
56
|
+
lib/mj/logging.rb
|
57
|
+
lib/mj/tools/ssh.rb
|
58
|
+
lib/mj/tools/subprocess.rb
|
59
|
+
lib/mj/visitor.rb
|
60
|
+
recipes/kde/files/finish_installation.sh
|
61
|
+
recipes/kde/files/kde4.desktop
|
62
|
+
recipes/kde/files/xsession
|
63
|
+
recipes/kde/info.yaml
|
64
|
+
recipes/kde/recipe
|
65
|
+
recipes/kde/recipe-local
|
66
|
+
recipes/kde/settings.yaml
|
67
|
+
recipes/kde43/info.yaml
|
68
|
+
recipes/kde43/recipe
|
69
|
+
recipes/kde43/recipe-local
|
70
|
+
recipes/kde43/settings.yaml
|
71
|
+
recipes/kdeqt4.6/custom/qt/qtscriptgenerator/compile.sh
|
72
|
+
recipes/kdeqt4.6/custom/qt/qtscriptgenerator/configure.sh
|
73
|
+
recipes/kdeqt4.6/custom/qt/qtscriptgenerator/install.sh
|
74
|
+
recipes/kdeqt4.6/info.yaml
|
75
|
+
recipes/kdeqt4.6/recipe
|
76
|
+
recipes/kdeqt4.6/recipe-local
|
77
|
+
recipes/kdeqt4.6/settings.yaml
|
78
|
+
tags
|
79
|
+
tasks/genfiles.rake
|
80
|
+
tasks/rdoc.rake
|
81
|
+
tasks/rspec.rake
|
82
|
+
test.rb
|
83
|
+
test/commands/test_build.rb
|
84
|
+
test/test_build_system.rb
|
85
|
+
test/test_cli.rb
|
86
|
+
test/test_command.rb
|
87
|
+
test/test_configuration_parser.rb
|
88
|
+
test/test_environment.rb
|
49
89
|
test/test_helper.rb
|
50
|
-
test/
|
51
|
-
test/
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
website/template.html.erb
|
90
|
+
test/test_module.rb
|
91
|
+
test/test_repository.rb
|
92
|
+
test/test_singleton.rb
|
93
|
+
test/test_ssh_key.rb
|
94
|
+
test/test_svn_parser.rb
|
95
|
+
test/test_vcs.rb
|
data/README.txt
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
= build-tool
|
2
|
+
|
3
|
+
* http://build-tool.rubyforge.org
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
This project is inspired by kdesvn-build[http://kdesvn-build.kde.org/].
|
8
|
+
|
9
|
+
It help in building and maintaining a development environment. It downloads
|
10
|
+
and configures sources and updates them later.
|
11
|
+
|
12
|
+
== FEATURES/PROBLEMS:
|
13
|
+
|
14
|
+
* This is major rewrite version. Use at your own risk.
|
15
|
+
|
16
|
+
The tool uses recipes to build software from scratch. It does
|
17
|
+
- Check out the sources from the repository (git, git-svn, svn).
|
18
|
+
- Update the sources.
|
19
|
+
- Set the build environment.
|
20
|
+
- Configure (qt, cmake, custom)
|
21
|
+
- Build
|
22
|
+
- Install
|
23
|
+
|
24
|
+
It's main purpose is supporting me developing kde while having a
|
25
|
+
complete kde workspace from trunk. I would like to have reliable and
|
26
|
+
reproducable build so i'm sure the code is the problem and not my environment
|
27
|
+
if something fails to build.
|
28
|
+
|
29
|
+
Additional features are:
|
30
|
+
- Open a shell with the environment used to build the sources.
|
31
|
+
- Provide sample xessions and kde.desktop files to use the result.
|
32
|
+
|
33
|
+
Currently the following recipes are provided:
|
34
|
+
- Qt 4.6 (either from the kde-qt or qtsoftware repositories.
|
35
|
+
- KDE 4.3
|
36
|
+
- KDE Trunk
|
37
|
+
|
38
|
+
== SYNOPSIS:
|
39
|
+
|
40
|
+
# Install a recipe
|
41
|
+
> build-tool recipe install kde
|
42
|
+
...
|
43
|
+
# Adapt the configuration
|
44
|
+
> vim ~/.build-tool/kde.yaml
|
45
|
+
|
46
|
+
# Build kdesupport/ modules and the base kde workspace
|
47
|
+
kde-build build kdesupport/ KDE/
|
48
|
+
|
49
|
+
== REQUIREMENTS:
|
50
|
+
|
51
|
+
* logging > 1.2.2
|
52
|
+
* hoe > 2.3.3
|
53
|
+
|
54
|
+
== INSTALL:
|
55
|
+
|
56
|
+
gem install build-tool
|
57
|
+
|
58
|
+
== LICENSE:
|
59
|
+
|
60
|
+
(The GPL LICENSE)
|
61
|
+
|
62
|
+
Copyright (c) 2009 Michael Jansen
|
63
|
+
|
data/Rakefile
CHANGED
@@ -1,32 +1,29 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
require 'fileutils'
|
6
|
+
require './lib/build-tool'
|
4
7
|
|
5
8
|
# Generate all the Rake tasks
|
6
9
|
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
7
|
-
Hoe.spec 'build-tool' do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
['log4r','>= 1.0.5'],
|
16
|
-
]
|
17
|
-
p.extra_dev_deps = [
|
18
|
-
['newgem', ">= #{::Newgem::VERSION}"],
|
19
|
-
['hoe', ">= 2.3.0"]
|
20
|
-
]
|
10
|
+
Hoe.spec 'build-tool' do
|
11
|
+
self.developer 'Michael Jansen', 'info@michael-jansen.biz'
|
12
|
+
self.post_install_message = <<-EOS
|
13
|
+
To start with build-tool try the following commands:
|
14
|
+
> build-tool recipe list
|
15
|
+
> build-tool recipe install <recipe>
|
16
|
+
EOS
|
17
|
+
self.rubyforge_name = self.name
|
21
18
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
self.extra_deps = [
|
20
|
+
['logging','>= 1.2.2'],
|
21
|
+
['hoe', ">= 2.3.3"], # -> hoe, rubigen
|
22
|
+
]
|
26
23
|
end
|
27
24
|
|
28
|
-
require 'newgem/tasks' # load /tasks/*.rake
|
29
25
|
Dir['tasks/**/*.rake'].each { |t| load t }
|
30
26
|
|
31
|
-
#
|
27
|
+
# Want other tests/tasks run by default
|
28
|
+
# remove_task :default
|
32
29
|
# task :default => [:spec, :features]
|
data/bin/build-tool
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Michael Jansen on 2009-8-31.
|
4
|
+
# Copyright (c) 2009. All rights reserved.
|
5
|
+
|
6
|
+
require 'pathname'
|
7
|
+
require 'rubygems'
|
8
|
+
require 'logging'
|
9
|
+
|
10
|
+
# libs relative to the link target
|
11
|
+
if File.symlink?(__FILE__)
|
12
|
+
root_directory = File.dirname(File.readlink(__FILE__))
|
13
|
+
else
|
14
|
+
root_directory = File.dirname(__FILE__)
|
15
|
+
end
|
16
|
+
root_directory = Pathname.new( root_directory ).join( '..' )
|
17
|
+
require File.expand_path( root_directory + "lib/build-tool")
|
18
|
+
require 'mj/logging'
|
19
|
+
|
20
|
+
#
|
21
|
+
# CONFIGURE LOGGING
|
22
|
+
#
|
23
|
+
Logging.init :debug, :trace, :verbose, :info, :warn, :error
|
24
|
+
include Logging.globally
|
25
|
+
Logging.logger.root.level = :debug
|
26
|
+
# Special case for the configurationParser. It is very verbose if active.
|
27
|
+
Logging.logger['BuildTool::Cfg::Parser'].level = :info
|
28
|
+
Logging.logger.root.appenders = Logging.appenders.stdout(
|
29
|
+
:layout => MJ::Logging::BasicLayout.new(),
|
30
|
+
:level => :info)
|
31
|
+
|
32
|
+
# if the name we were called with is a symbolic link we have to search for our
|
33
|
+
|
34
|
+
|
35
|
+
require "build-tool/application"
|
36
|
+
require "build-tool/errors"
|
37
|
+
|
38
|
+
begin
|
39
|
+
app = BuildTool::Application.new( $0, root_directory )
|
40
|
+
rc = app.execute( ARGV )
|
41
|
+
rescue Interrupt => e
|
42
|
+
logger.info "User interrupt!"
|
43
|
+
rc = 0
|
44
|
+
rescue BuildTool::Error => e
|
45
|
+
logger.error e.message
|
46
|
+
logger.verbose e.backtrace.join("\n")
|
47
|
+
rc = -1
|
48
|
+
rescue Exception => e
|
49
|
+
logger.error e
|
50
|
+
rc = -1
|
51
|
+
end
|
52
|
+
|
53
|
+
exit rc
|
data/lib/build-tool.rb
ADDED
@@ -0,0 +1,360 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
module Gem
|
8
|
+
|
9
|
+
##
|
10
|
+
# Module that defines the default UserInteraction. Any class including this
|
11
|
+
# module will have access to the +ui+ method that returns the default UI.
|
12
|
+
|
13
|
+
module DefaultUserInteraction
|
14
|
+
|
15
|
+
##
|
16
|
+
# The default UI is a class variable of the singleton class for this
|
17
|
+
# module.
|
18
|
+
|
19
|
+
@ui = nil
|
20
|
+
|
21
|
+
##
|
22
|
+
# Return the default UI.
|
23
|
+
|
24
|
+
def self.ui
|
25
|
+
@ui ||= Gem::ConsoleUI.new
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Set the default UI. If the default UI is never explicitly set, a simple
|
30
|
+
# console based UserInteraction will be used automatically.
|
31
|
+
|
32
|
+
def self.ui=(new_ui)
|
33
|
+
@ui = new_ui
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# Use +new_ui+ for the duration of +block+.
|
38
|
+
|
39
|
+
def self.use_ui(new_ui)
|
40
|
+
old_ui = @ui
|
41
|
+
@ui = new_ui
|
42
|
+
yield
|
43
|
+
ensure
|
44
|
+
@ui = old_ui
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# See DefaultUserInteraction::ui
|
49
|
+
|
50
|
+
def ui
|
51
|
+
DefaultUserInteraction.ui
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# See DefaultUserInteraction::ui=
|
56
|
+
|
57
|
+
def ui=(new_ui)
|
58
|
+
DefaultUserInteraction.ui = new_ui
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# See DefaultUserInteraction::use_ui
|
63
|
+
|
64
|
+
def use_ui(new_ui, &block)
|
65
|
+
DefaultUserInteraction.use_ui(new_ui, &block)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# Make the default UI accessable without the "ui." prefix. Classes
|
72
|
+
# including this module may use the interaction methods on the default UI
|
73
|
+
# directly. Classes may also reference the ui and ui= methods.
|
74
|
+
#
|
75
|
+
# Example:
|
76
|
+
#
|
77
|
+
# class X
|
78
|
+
# include Gem::UserInteraction
|
79
|
+
#
|
80
|
+
# def get_answer
|
81
|
+
# n = ask("What is the meaning of life?")
|
82
|
+
# end
|
83
|
+
# end
|
84
|
+
|
85
|
+
module UserInteraction
|
86
|
+
|
87
|
+
include DefaultUserInteraction
|
88
|
+
|
89
|
+
[:alert,
|
90
|
+
:alert_error,
|
91
|
+
:alert_warning,
|
92
|
+
:ask,
|
93
|
+
:ask_yes_no,
|
94
|
+
:choose_from_list,
|
95
|
+
:say,
|
96
|
+
:terminate_interaction ].each do |methname|
|
97
|
+
class_eval %{
|
98
|
+
def #{methname}(*args)
|
99
|
+
ui.#{methname}(*args)
|
100
|
+
end
|
101
|
+
}, __FILE__, __LINE__
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
##
|
106
|
+
# StreamUI implements a simple stream based user interface.
|
107
|
+
|
108
|
+
class StreamUI
|
109
|
+
|
110
|
+
attr_reader :ins, :outs, :errs
|
111
|
+
|
112
|
+
def initialize(in_stream, out_stream, err_stream=STDERR)
|
113
|
+
@ins = in_stream
|
114
|
+
@outs = out_stream
|
115
|
+
@errs = err_stream
|
116
|
+
end
|
117
|
+
|
118
|
+
##
|
119
|
+
# Choose from a list of options. +question+ is a prompt displayed above
|
120
|
+
# the list. +list+ is a list of option strings. Returns the pair
|
121
|
+
# [option_name, option_index].
|
122
|
+
|
123
|
+
def choose_from_list(question, list)
|
124
|
+
@outs.puts question
|
125
|
+
|
126
|
+
list.each_with_index do |item, index|
|
127
|
+
@outs.puts " #{index+1}. #{item}"
|
128
|
+
end
|
129
|
+
|
130
|
+
@outs.print "> "
|
131
|
+
@outs.flush
|
132
|
+
|
133
|
+
result = @ins.gets
|
134
|
+
|
135
|
+
return nil, nil unless result
|
136
|
+
|
137
|
+
result = result.strip.to_i - 1
|
138
|
+
return list[result], result
|
139
|
+
end
|
140
|
+
|
141
|
+
##
|
142
|
+
# Ask a question. Returns a true for yes, false for no. If not connected
|
143
|
+
# to a tty, raises an exception if default is nil, otherwise returns
|
144
|
+
# default.
|
145
|
+
|
146
|
+
def ask_yes_no(question, default=nil)
|
147
|
+
unless @ins.tty? then
|
148
|
+
if default.nil? then
|
149
|
+
raise Gem::OperationNotSupportedError,
|
150
|
+
"Not connected to a tty and no default specified"
|
151
|
+
else
|
152
|
+
return default
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
qstr = case default
|
157
|
+
when nil
|
158
|
+
'yn'
|
159
|
+
when true
|
160
|
+
'Yn'
|
161
|
+
else
|
162
|
+
'yN'
|
163
|
+
end
|
164
|
+
|
165
|
+
result = nil
|
166
|
+
|
167
|
+
while result.nil?
|
168
|
+
result = ask("#{question} [#{qstr}]")
|
169
|
+
result = case result
|
170
|
+
when /^[Yy].*/
|
171
|
+
true
|
172
|
+
when /^[Nn].*/
|
173
|
+
false
|
174
|
+
when /^$/
|
175
|
+
default
|
176
|
+
else
|
177
|
+
nil
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
return result
|
182
|
+
end
|
183
|
+
|
184
|
+
##
|
185
|
+
# Ask a question. Returns an answer if connected to a tty, nil otherwise.
|
186
|
+
|
187
|
+
def ask(question)
|
188
|
+
return nil if not @ins.tty?
|
189
|
+
|
190
|
+
@outs.print(question + " ")
|
191
|
+
@outs.flush
|
192
|
+
|
193
|
+
result = @ins.gets
|
194
|
+
result.chomp! if result
|
195
|
+
result
|
196
|
+
end
|
197
|
+
|
198
|
+
##
|
199
|
+
# Display a statement.
|
200
|
+
|
201
|
+
def say(statement="")
|
202
|
+
@outs.puts statement
|
203
|
+
end
|
204
|
+
|
205
|
+
##
|
206
|
+
# Display an informational alert. Will ask +question+ if it is not nil.
|
207
|
+
|
208
|
+
def alert(statement, question=nil)
|
209
|
+
@outs.puts "INFO: #{statement}"
|
210
|
+
ask(question) if question
|
211
|
+
end
|
212
|
+
|
213
|
+
##
|
214
|
+
# Display a warning in a location expected to get error messages. Will
|
215
|
+
# ask +question+ if it is not nil.
|
216
|
+
|
217
|
+
def alert_warning(statement, question=nil)
|
218
|
+
@errs.puts "WARNING: #{statement}"
|
219
|
+
ask(question) if question
|
220
|
+
end
|
221
|
+
|
222
|
+
##
|
223
|
+
# Display an error message in a location expected to get error messages.
|
224
|
+
# Will ask +question+ if it is not nil.
|
225
|
+
|
226
|
+
def alert_error(statement, question=nil)
|
227
|
+
@errs.puts "ERROR: #{statement}"
|
228
|
+
ask(question) if question
|
229
|
+
end
|
230
|
+
|
231
|
+
##
|
232
|
+
# Terminate the application with exit code +status+, running any exit
|
233
|
+
# handlers that might have been defined.
|
234
|
+
|
235
|
+
def terminate_interaction(status = 0)
|
236
|
+
raise Gem::SystemExitException, status
|
237
|
+
end
|
238
|
+
|
239
|
+
##
|
240
|
+
# Return a progress reporter object chosen from the current verbosity.
|
241
|
+
|
242
|
+
def progress_reporter(*args)
|
243
|
+
case Gem.configuration.verbose
|
244
|
+
when nil, false
|
245
|
+
SilentProgressReporter.new(@outs, *args)
|
246
|
+
when true
|
247
|
+
SimpleProgressReporter.new(@outs, *args)
|
248
|
+
else
|
249
|
+
VerboseProgressReporter.new(@outs, *args)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
##
|
254
|
+
# An absolutely silent progress reporter.
|
255
|
+
|
256
|
+
class SilentProgressReporter
|
257
|
+
attr_reader :count
|
258
|
+
|
259
|
+
def initialize(out_stream, size, initial_message, terminal_message = nil)
|
260
|
+
end
|
261
|
+
|
262
|
+
def updated(message)
|
263
|
+
end
|
264
|
+
|
265
|
+
def done
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
##
|
270
|
+
# A basic dotted progress reporter.
|
271
|
+
|
272
|
+
class SimpleProgressReporter
|
273
|
+
include DefaultUserInteraction
|
274
|
+
|
275
|
+
attr_reader :count
|
276
|
+
|
277
|
+
def initialize(out_stream, size, initial_message,
|
278
|
+
terminal_message = "complete")
|
279
|
+
@out = out_stream
|
280
|
+
@total = size
|
281
|
+
@count = 0
|
282
|
+
@terminal_message = terminal_message
|
283
|
+
|
284
|
+
@out.puts initial_message
|
285
|
+
end
|
286
|
+
|
287
|
+
##
|
288
|
+
# Prints out a dot and ignores +message+.
|
289
|
+
|
290
|
+
def updated(message)
|
291
|
+
@count += 1
|
292
|
+
@out.print "."
|
293
|
+
@out.flush
|
294
|
+
end
|
295
|
+
|
296
|
+
##
|
297
|
+
# Prints out the terminal message.
|
298
|
+
|
299
|
+
def done
|
300
|
+
@out.puts "\n#{@terminal_message}"
|
301
|
+
end
|
302
|
+
|
303
|
+
end
|
304
|
+
|
305
|
+
##
|
306
|
+
# A progress reporter that prints out messages about the current progress.
|
307
|
+
|
308
|
+
class VerboseProgressReporter
|
309
|
+
include DefaultUserInteraction
|
310
|
+
|
311
|
+
attr_reader :count
|
312
|
+
|
313
|
+
def initialize(out_stream, size, initial_message,
|
314
|
+
terminal_message = 'complete')
|
315
|
+
@out = out_stream
|
316
|
+
@total = size
|
317
|
+
@count = 0
|
318
|
+
@terminal_message = terminal_message
|
319
|
+
|
320
|
+
@out.puts initial_message
|
321
|
+
end
|
322
|
+
|
323
|
+
##
|
324
|
+
# Prints out the position relative to the total and the +message+.
|
325
|
+
|
326
|
+
def updated(message)
|
327
|
+
@count += 1
|
328
|
+
@out.puts "#{@count}/#{@total}: #{message}"
|
329
|
+
end
|
330
|
+
|
331
|
+
##
|
332
|
+
# Prints out the terminal message.
|
333
|
+
|
334
|
+
def done
|
335
|
+
@out.puts @terminal_message
|
336
|
+
end
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
##
|
341
|
+
# Subclass of StreamUI that instantiates the user interaction using STDIN,
|
342
|
+
# STDOUT, and STDERR.
|
343
|
+
|
344
|
+
class ConsoleUI < StreamUI
|
345
|
+
def initialize
|
346
|
+
super(STDIN, STDOUT, STDERR)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
##
|
351
|
+
# SilentUI is a UI choice that is absolutely silent.
|
352
|
+
|
353
|
+
class SilentUI
|
354
|
+
def method_missing(sym, *args, &block)
|
355
|
+
self
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
end
|
360
|
+
|