pluginfactory 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|