pluginfactory 1.0.3 → 1.0.4
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/ChangeLog +26 -0
- data/README +1 -1
- data/Rakefile +82 -22
- data/lib/pluginfactory.rb +77 -39
- data/rake/191_compat.rb +26 -0
- data/rake/dependencies.rb +25 -11
- data/rake/helpers.rb +65 -40
- data/rake/manual.rb +464 -64
- data/rake/publishing.rb +30 -16
- data/rake/rdoc.rb +36 -21
- data/rake/svn.rb +166 -25
- data/rake/testing.rb +46 -35
- data/rake/win32.rb +94 -0
- data/spec/lib/helpers.rb +247 -0
- data/spec/pluginfactory_spec.rb +43 -69
- metadata +138 -9
data/rake/testing.rb
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
#
|
2
2
|
# Rake tasklib for testing tasks
|
3
|
-
# $Id: testing.rb
|
3
|
+
# $Id: testing.rb 80 2008-12-20 19:50:19Z deveiant $
|
4
4
|
#
|
5
5
|
# Authors:
|
6
6
|
# * Michael Granger <ged@FaerieMUD.org>
|
7
7
|
#
|
8
8
|
|
9
|
-
|
9
|
+
unless defined?( COVERAGE_MINIMUM )
|
10
|
+
if ENV['COVVERAGE_MINIMUM']
|
11
|
+
COVERAGE_MINIMUM = Float( ENV['COVERAGE_MINIMUM'] )
|
12
|
+
else
|
13
|
+
COVERAGE_MINIMUM = 85.0
|
14
|
+
end
|
15
|
+
end
|
10
16
|
SPEC_FILES = [] unless defined?( SPEC_FILES )
|
11
17
|
TEST_FILES = [] unless defined?( TEST_FILES )
|
12
18
|
|
13
|
-
COMMON_SPEC_OPTS = ['-
|
19
|
+
COMMON_SPEC_OPTS = ['-Du', '-b'] unless defined?( COMMON_SPEC_OPTS )
|
14
20
|
|
15
21
|
COVERAGE_TARGETDIR = BASEDIR + 'coverage' unless defined?( COVERAGE_TARGETDIR )
|
16
22
|
RCOV_EXCLUDES = 'spec,tests,/Library/Ruby,/var/lib,/usr/local/lib' unless
|
@@ -34,15 +40,12 @@ end
|
|
34
40
|
### RSpec specifications
|
35
41
|
begin
|
36
42
|
gem 'rspec', '>= 1.1.3'
|
43
|
+
|
44
|
+
require 'spec'
|
37
45
|
require 'spec/rake/spectask'
|
38
46
|
|
39
47
|
### Task: spec
|
40
|
-
|
41
|
-
task.spec_files = SPEC_FILES
|
42
|
-
task.libs += [LIBDIR]
|
43
|
-
task.spec_opts = COMMON_SPEC_OPTS
|
44
|
-
end
|
45
|
-
|
48
|
+
task :spec => 'spec:doc'
|
46
49
|
|
47
50
|
namespace :spec do
|
48
51
|
desc "Run rspec every time there's a change to one of the files"
|
@@ -50,28 +53,33 @@ begin
|
|
50
53
|
require 'autotest/rspec'
|
51
54
|
|
52
55
|
autotester = Autotest::Rspec.new
|
53
|
-
autotester.exceptions = %r{\.svn|\.skel}
|
54
56
|
autotester.run
|
55
57
|
end
|
56
58
|
|
59
|
+
desc "Generate regular color 'doc' spec output"
|
60
|
+
Spec::Rake::SpecTask.new( :doc ) do |task|
|
61
|
+
task.spec_files = SPEC_FILES
|
62
|
+
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 's', '-c']
|
63
|
+
end
|
57
64
|
|
58
|
-
desc "Generate
|
59
|
-
Spec::Rake::SpecTask.new( :
|
65
|
+
desc "Generate spec output with profiling"
|
66
|
+
Spec::Rake::SpecTask.new( :profile ) do |task|
|
60
67
|
task.spec_files = SPEC_FILES
|
61
|
-
task.spec_opts = ['-f', '
|
68
|
+
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'o']
|
62
69
|
end
|
63
70
|
|
64
|
-
desc "Generate
|
65
|
-
Spec::Rake::SpecTask.new( :
|
71
|
+
desc "Generate quiet non-colored plain-text output"
|
72
|
+
Spec::Rake::SpecTask.new( :quiet ) do |task|
|
66
73
|
task.spec_files = SPEC_FILES
|
67
|
-
task.spec_opts = ['-f',
|
74
|
+
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'p']
|
68
75
|
end
|
69
76
|
|
70
|
-
desc "Generate
|
71
|
-
Spec::Rake::SpecTask.new( :
|
77
|
+
desc "Generate HTML output"
|
78
|
+
Spec::Rake::SpecTask.new( :html ) do |task|
|
72
79
|
task.spec_files = SPEC_FILES
|
73
|
-
task.spec_opts = ['-f','
|
80
|
+
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'h']
|
74
81
|
end
|
82
|
+
|
75
83
|
end
|
76
84
|
rescue LoadError => err
|
77
85
|
task :no_rspec do
|
@@ -81,9 +89,10 @@ rescue LoadError => err
|
|
81
89
|
task :spec => :no_rspec
|
82
90
|
namespace :spec do
|
83
91
|
task :autotest => :no_rspec
|
92
|
+
task :doc => :no_rspec
|
93
|
+
task :profile => :no_rspec
|
84
94
|
task :quiet => :no_rspec
|
85
95
|
task :html => :no_rspec
|
86
|
-
task :text => :no_rspec
|
87
96
|
end
|
88
97
|
end
|
89
98
|
|
@@ -112,8 +121,10 @@ begin
|
|
112
121
|
gem 'rcov'
|
113
122
|
gem 'rspec', '>= 1.1.3'
|
114
123
|
|
124
|
+
require 'spec'
|
125
|
+
require 'rcov'
|
126
|
+
|
115
127
|
### Task: coverage (via RCov)
|
116
|
-
### Task: rcov
|
117
128
|
desc "Build test coverage reports"
|
118
129
|
unless SPEC_FILES.empty?
|
119
130
|
Spec::Rake::SpecTask.new( :coverage ) do |task|
|
@@ -124,19 +135,20 @@ begin
|
|
124
135
|
task.rcov = true
|
125
136
|
end
|
126
137
|
end
|
127
|
-
|
128
|
-
|
138
|
+
# unless TEST_FILES.empty?
|
139
|
+
# require 'rcov/rcovtask'
|
129
140
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
141
|
+
# Rcov::RcovTask.new do |task|
|
142
|
+
# task.libs += [LIBDIR]
|
143
|
+
# task.test_files = TEST_FILES
|
144
|
+
# task.verbose = true
|
145
|
+
# task.rcov_opts = RCOV_OPTS
|
146
|
+
# end
|
147
|
+
# end
|
137
148
|
|
138
149
|
|
139
|
-
|
150
|
+
### Task: rcov
|
151
|
+
task :rcov => :coverage
|
140
152
|
|
141
153
|
### Other coverage tasks
|
142
154
|
namespace :coverage do
|
@@ -150,7 +162,8 @@ begin
|
|
150
162
|
desc "Show differences in coverage from last run"
|
151
163
|
Spec::Rake::SpecTask.new( :diff ) do |task|
|
152
164
|
task.spec_files = SPEC_FILES
|
153
|
-
task.
|
165
|
+
task.spec_opts = ['-f', 'p', '-b']
|
166
|
+
task.rcov_opts = RCOV_OPTS - ['--save'] + ['--text-coverage-diff']
|
154
167
|
task.rcov = true
|
155
168
|
end
|
156
169
|
|
@@ -168,9 +181,7 @@ begin
|
|
168
181
|
end
|
169
182
|
end
|
170
183
|
|
171
|
-
|
172
|
-
rmtree( COVERAGE_TARGETDIR )
|
173
|
-
end
|
184
|
+
CLOBBER.include( COVERAGE_TARGETDIR )
|
174
185
|
|
175
186
|
rescue LoadError => err
|
176
187
|
task :no_rcov do
|
data/rake/win32.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
#
|
2
|
+
# Win32-specific tasks (cross-compiling, etc.)
|
3
|
+
#
|
4
|
+
# Thanks to some people that understand this stuff better than me for
|
5
|
+
# posting helpful blog posts. This stuff is an amalgam of stuff they did:
|
6
|
+
#
|
7
|
+
# * Mauricio Fernandez
|
8
|
+
# http://eigenclass.org/hiki/cross+compiling+rcovrt
|
9
|
+
#
|
10
|
+
# * Jeremy Hinegardner
|
11
|
+
# http://www.copiousfreetime.org/articles/2008/10/12/building-gems-for-windows.html
|
12
|
+
#
|
13
|
+
# * Aaron Patterson
|
14
|
+
# http://tenderlovemaking.com/2008/11/21/cross-compiling-ruby-gems-for-win32/
|
15
|
+
|
16
|
+
require 'pathname'
|
17
|
+
require 'rbconfig'
|
18
|
+
|
19
|
+
HOMEDIR = Pathname( '~' ).expand_path
|
20
|
+
RUBYVERSION = '1.8.6-p287'
|
21
|
+
RUBY_DL_BASE = 'ftp://ftp.ruby-lang.org/pub/ruby/1.8/'
|
22
|
+
RUBY_DL_URI = RUBY_DL_BASE + "ruby-#{RUBYVERSION}.tar.gz"
|
23
|
+
|
24
|
+
XCOMPILER_DIR = HOMEDIR + '.ruby_mingw32'
|
25
|
+
|
26
|
+
XCOMPILER_DL = XCOMPILER_DIR + "ruby-#{RUBYVERSION}.tar.gz"
|
27
|
+
XCOMPILER_SRC = XCOMPILER_DIR + "ruby-#{RUBYVERSION}"
|
28
|
+
|
29
|
+
XCOMPILER_BIN = XCOMPILER_DIR + 'bin'
|
30
|
+
XCOMPILER_RUBY = XCOMPILER_BIN + 'ruby.exe'
|
31
|
+
|
32
|
+
NEW_ALT_SEPARATOR = '"\\\\\" ' + ?\
|
33
|
+
|
34
|
+
CONFIGURE_CMD = %w[
|
35
|
+
env
|
36
|
+
ac_cv_func_getpgrp_void=no
|
37
|
+
ac_cv_func_setpgrp_void=yes
|
38
|
+
rb_cv_negative_time_t=no
|
39
|
+
ac_cv_func_memcmp_working=yes
|
40
|
+
rb_cv_binary_elf=no
|
41
|
+
./configure
|
42
|
+
--host=i386-mingw32
|
43
|
+
--target=i386-mingw32
|
44
|
+
--build=#{RUBY_PLATFORM}
|
45
|
+
--prefix=#{XCOMPILER_DIR}
|
46
|
+
]
|
47
|
+
|
48
|
+
begin
|
49
|
+
require 'archive/tar'
|
50
|
+
|
51
|
+
namespace :win32 do
|
52
|
+
directory XCOMPILER_DIR
|
53
|
+
|
54
|
+
file XCOMPILER_DL => XCOMPILER_DIR do
|
55
|
+
download RUBY_DL_URI, XCOMPILER_DL
|
56
|
+
end
|
57
|
+
|
58
|
+
directory XCOMPILER_SRC
|
59
|
+
task XCOMPILER_SRC => [ XCOMPILER_DIR, XCOMPILER_DL ] do
|
60
|
+
Archive::Tar.extract( XCOMPILER_DL, XCOMPILER_DIR, :compression => :gzip ) or
|
61
|
+
fail "Extraction of %s failed." % [ XCOMPILER_DL ]
|
62
|
+
end
|
63
|
+
|
64
|
+
file XCOMPILER_RUBY => XCOMPILER_SRC do
|
65
|
+
Dir.chdir( XCOMPILER_SRC ) do
|
66
|
+
File.open( 'Makefile.in.new', IO::CREAT|IO::WRONLY|IO::EXCL ) do |ofh|
|
67
|
+
File.each_line( 'Makefile.in' ) do |line|
|
68
|
+
line.sub!( /ALT_SEPARATOR = "\\\\"/, NEW_ALT_SEPARATOR )
|
69
|
+
ofh.write( line )
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
mv 'Makefile.in.new', 'Makefile.in'
|
74
|
+
|
75
|
+
run *CONFIGURE_CMD
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
task :build => XCOMPILER_RUBY do
|
80
|
+
log "Building..."
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
rescue LoadError => err
|
85
|
+
task :no_win32_build do
|
86
|
+
fatal "No win32 build: %s: %s" % [ err.class.name, err.message ]
|
87
|
+
end
|
88
|
+
|
89
|
+
namespace :win32 do
|
90
|
+
task :build => :no_win32_build
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
data/spec/lib/helpers.rb
ADDED
@@ -0,0 +1,247 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# coding: utf-8
|
3
|
+
|
4
|
+
BEGIN {
|
5
|
+
require 'pathname'
|
6
|
+
basedir = Pathname.new( __FILE__ ).dirname.parent
|
7
|
+
|
8
|
+
libdir = basedir + "lib"
|
9
|
+
extdir = basedir + "ext"
|
10
|
+
|
11
|
+
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
12
|
+
$LOAD_PATH.unshift( extdir.to_s ) unless $LOAD_PATH.include?( extdir.to_s )
|
13
|
+
}
|
14
|
+
|
15
|
+
require 'erb'
|
16
|
+
|
17
|
+
### RSpec helper functions.
|
18
|
+
module PluginFactory::SpecHelpers
|
19
|
+
|
20
|
+
unless defined?( LEVEL )
|
21
|
+
LEVEL = {
|
22
|
+
:debug => Logger::DEBUG,
|
23
|
+
:info => Logger::INFO,
|
24
|
+
:warn => Logger::WARN,
|
25
|
+
:error => Logger::ERROR,
|
26
|
+
:fatal => Logger::FATAL,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
###############
|
31
|
+
module_function
|
32
|
+
###############
|
33
|
+
|
34
|
+
### Reset the logging subsystem to its default state.
|
35
|
+
def reset_logging
|
36
|
+
PluginFactory.reset_logger
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
### Alter the output of the default log formatter to be pretty in SpecMate output
|
42
|
+
def setup_logging( level=Logger::FATAL )
|
43
|
+
|
44
|
+
# Turn symbol-style level config into Logger's expected Fixnum level
|
45
|
+
if LEVEL.key?( level )
|
46
|
+
level = LEVEL[ level ]
|
47
|
+
end
|
48
|
+
|
49
|
+
logger = Logger.new( $stderr )
|
50
|
+
PluginFactory.logger = logger
|
51
|
+
PluginFactory.logger.level = level
|
52
|
+
|
53
|
+
# Only do this when executing from a spec in TextMate
|
54
|
+
if ENV['HTML_LOGGING'] || (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
|
55
|
+
PluginFactory.logger.formatter = HtmlLogFormatter.new( logger )
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
### Make Logger output stuff in a form that looks nice(er) in SpecMate output.
|
64
|
+
class HtmlLogFormatter < Logger::Formatter
|
65
|
+
include ERB::Util # for html_escape()
|
66
|
+
|
67
|
+
unless defined?( HTML_LOG_FORMAT )
|
68
|
+
HTML_LOG_FORMAT = %q{
|
69
|
+
<dd class="log-message %5$s">
|
70
|
+
<span class="log-time">%1$s.%2$06d</span>
|
71
|
+
[
|
72
|
+
<span class="log-pid">%3$d</span>
|
73
|
+
/
|
74
|
+
<span class="log-tid">%4$s</span>
|
75
|
+
]
|
76
|
+
<span class="log-level">%5$s</span>
|
77
|
+
:
|
78
|
+
<span class="log-name">%6$s</span>
|
79
|
+
<span class="log-message-text">%7$s</span>
|
80
|
+
</dd>
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
### Override the logging formats with ones that generate HTML fragments
|
85
|
+
def initialize( logger, format=HTML_LOG_FORMAT ) # :notnew:
|
86
|
+
@logger = logger
|
87
|
+
@format = format
|
88
|
+
super()
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
######
|
93
|
+
public
|
94
|
+
######
|
95
|
+
|
96
|
+
# The HTML fragment that will be used as a format() string for the log
|
97
|
+
attr_accessor :format
|
98
|
+
|
99
|
+
|
100
|
+
### Return a log message composed out of the arguments formatted using the
|
101
|
+
### formatter's format string
|
102
|
+
def call( severity, time, progname, msg )
|
103
|
+
args = [
|
104
|
+
time.strftime( '%Y-%m-%d %H:%M:%S' ), # %1$s
|
105
|
+
time.usec, # %2$d
|
106
|
+
Process.pid, # %3$d
|
107
|
+
Thread.current == Thread.main ? 'main' : Thread.object_id, # %4$s
|
108
|
+
severity, # %5$s
|
109
|
+
progname, # %6$s
|
110
|
+
html_escape( msg ).gsub(/\n/, '<br />') # %7$s
|
111
|
+
]
|
112
|
+
|
113
|
+
return self.format % args
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
# Override the badly-structured output of the RSpec HTML formatter
|
120
|
+
require 'spec/runner/formatter/html_formatter'
|
121
|
+
|
122
|
+
class Spec::Runner::Formatter::HtmlFormatter
|
123
|
+
def example_failed( example, counter, failure )
|
124
|
+
failure_style = failure.pending_fixed? ? 'pending_fixed' : 'failed'
|
125
|
+
|
126
|
+
unless @header_red
|
127
|
+
@output.puts " <script type=\"text/javascript\">makeRed('rspec-header');</script>"
|
128
|
+
@header_red = true
|
129
|
+
end
|
130
|
+
|
131
|
+
unless @example_group_red
|
132
|
+
css_class = 'example_group_%d' % [current_example_group_number || 0]
|
133
|
+
@output.puts " <script type=\"text/javascript\">makeRed('#{css_class}');</script>"
|
134
|
+
@example_group_red = true
|
135
|
+
end
|
136
|
+
|
137
|
+
move_progress()
|
138
|
+
|
139
|
+
@output.puts " <dd class=\"spec #{failure_style}\">",
|
140
|
+
" <span class=\"failed_spec_name\">#{h(example.description)}</span>",
|
141
|
+
" <div class=\"failure\" id=\"failure_#{counter}\">"
|
142
|
+
if failure.exception
|
143
|
+
backtrace = format_backtrace( failure.exception.backtrace )
|
144
|
+
message = failure.exception.message
|
145
|
+
|
146
|
+
@output.puts " <div class=\"message\"><code>#{h message}</code></div>",
|
147
|
+
" <div class=\"backtrace\"><pre>#{backtrace}</pre></div>"
|
148
|
+
end
|
149
|
+
|
150
|
+
if extra = extra_failure_content( failure )
|
151
|
+
@output.puts( extra )
|
152
|
+
end
|
153
|
+
|
154
|
+
@output.puts " </div>",
|
155
|
+
" </dd>"
|
156
|
+
@output.flush
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
if instance_methods.include?('global_styles') || instance_methods.include?(:global_styles)
|
161
|
+
alias_method :default_global_styles, :global_styles
|
162
|
+
else
|
163
|
+
def default_global_styles
|
164
|
+
"/* No default global_styles (methods: %p)?!? */" % [ instance_methods ]
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def global_styles
|
169
|
+
css = default_global_styles()
|
170
|
+
css << %Q{
|
171
|
+
/* Stuff added by #{__FILE__} */
|
172
|
+
|
173
|
+
/* Overrides */
|
174
|
+
#rspec-header {
|
175
|
+
-webkit-box-shadow: #333 0 2px 5px;
|
176
|
+
margin-bottom: 1em;
|
177
|
+
}
|
178
|
+
|
179
|
+
.example_group dt {
|
180
|
+
-webkit-box-shadow: #333 0 2px 3px;
|
181
|
+
}
|
182
|
+
|
183
|
+
/* Style for log output */
|
184
|
+
dd.log-message {
|
185
|
+
background: #eee;
|
186
|
+
padding: 0 2em;
|
187
|
+
margin: 0.2em 1em;
|
188
|
+
border-bottom: 1px dotted #999;
|
189
|
+
border-top: 1px dotted #999;
|
190
|
+
text-indent: -1em;
|
191
|
+
}
|
192
|
+
|
193
|
+
/* Parts of the message */
|
194
|
+
dd.log-message .log-time {
|
195
|
+
font-weight: bold;
|
196
|
+
}
|
197
|
+
dd.log-message .log-time:after {
|
198
|
+
content: ": ";
|
199
|
+
}
|
200
|
+
dd.log-message .log-level {
|
201
|
+
font-variant: small-caps;
|
202
|
+
border: 1px solid #ccc;
|
203
|
+
padding: 1px 2px;
|
204
|
+
}
|
205
|
+
dd.log-message .log-name {
|
206
|
+
font-size: 1.2em;
|
207
|
+
color: #1e51b2;
|
208
|
+
}
|
209
|
+
dd.log-message .log-name:before { content: "«"; }
|
210
|
+
dd.log-message .log-name:after { content: "»"; }
|
211
|
+
|
212
|
+
dd.log-message .log-message-text {
|
213
|
+
padding-left: 4px;
|
214
|
+
font-family: Monaco, "Andale Mono", "Vera Sans Mono", mono;
|
215
|
+
}
|
216
|
+
|
217
|
+
|
218
|
+
/* Distinguish levels */
|
219
|
+
dd.log-message.debug { color: #666; }
|
220
|
+
dd.log-message.info {}
|
221
|
+
|
222
|
+
dd.log-message.warn,
|
223
|
+
dd.log-message.error {
|
224
|
+
background: #ff9;
|
225
|
+
}
|
226
|
+
dd.log-message.error .log-level,
|
227
|
+
dd.log-message.error .log-message-text {
|
228
|
+
color: #900;
|
229
|
+
}
|
230
|
+
dd.log-message.fatal {
|
231
|
+
background: #900;
|
232
|
+
color: white;
|
233
|
+
font-weight: bold;
|
234
|
+
border: 0;
|
235
|
+
}
|
236
|
+
dd.log-message.fatal .log-name {
|
237
|
+
color: white;
|
238
|
+
}
|
239
|
+
}
|
240
|
+
|
241
|
+
return css
|
242
|
+
end
|
243
|
+
end # module PluginFactory::SpecHelpers
|
244
|
+
|
245
|
+
|
246
|
+
# vim: set nosta noet ts=4 sw=4:
|
247
|
+
|