pluginfactory 1.0.7 → 1.0.8

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.
@@ -23,12 +23,12 @@ class FactoryError < RuntimeError; end
23
23
  #
24
24
  # == Creation Argument Variants
25
25
  #
26
- # The +create+ class method added to your class by PluginFactory searches for your module using
26
+ # The +create+ class method added to your class by PluginFactory searches for your module using
27
27
  #
28
28
  # == Synopsis
29
- #
29
+ #
30
30
  # in driver.rb:
31
- #
31
+ #
32
32
  # require "PluginFactory"
33
33
  #
34
34
  # class Driver
@@ -37,50 +37,74 @@ class FactoryError < RuntimeError; end
37
37
  # ["drivers"]
38
38
  # end
39
39
  # end
40
- #
40
+ #
41
41
  # in drivers/mysql.rb:
42
- #
42
+ #
43
43
  # require 'driver'
44
44
  #
45
45
  # class MysqlDriver < Driver
46
46
  # ...implementation...
47
47
  # end
48
- #
48
+ #
49
49
  # in /usr/lib/ruby/1.8/PostgresDriver.rb:
50
- #
50
+ #
51
51
  # require 'driver'
52
52
  #
53
53
  # class PostgresDriver < Driver
54
54
  # ...implementation...
55
55
  # end
56
- #
56
+ #
57
57
  # elsewhere
58
- #
58
+ #
59
59
  # require 'driver'
60
60
  #
61
61
  # config[:driver_type] #=> "mysql"
62
62
  # driver = Driver.create( config[:driver_type] )
63
63
  # driver.class #=> MysqlDriver
64
64
  # pgdriver = Driver.create( "PostGresDriver" )
65
- #
65
+ #
66
66
  # == Authors
67
- #
67
+ #
68
68
  # * Martin Chase <stillflame@FaerieMUD.org>
69
69
  # * Michael Granger <ged@FaerieMUD.org>
70
- #
71
- # :include: LICENSE
72
70
  #
73
- #---
71
+ # == License
72
+ #
73
+ # Copyright (c) 2008-2012 Michael Granger and Martin Chase
74
+ # All rights reserved.
75
+ #
76
+ # Redistribution and use in source and binary forms, with or without
77
+ # modification, are permitted provided that the following conditions are met:
78
+ #
79
+ # * Redistributions of source code must retain the above copyright notice,
80
+ # this list of conditions and the following disclaimer.
81
+ #
82
+ # * Redistributions in binary form must reproduce the above copyright notice,
83
+ # this list of conditions and the following disclaimer in the documentation
84
+ # and/or other materials provided with the distribution.
85
+ #
86
+ # * Neither the name of the author/s, nor the names of the project's
87
+ # contributors may be used to endorse or promote products derived from this
88
+ # software without specific prior written permission.
74
89
  #
75
- # Please see the file LICENSE for licensing details.
90
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
91
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
92
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
93
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
94
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
95
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
96
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
97
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
98
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
99
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
76
100
  #
77
101
  module PluginFactory
78
102
 
79
103
  # Library version
80
- VERSION = '1.0.7'
104
+ VERSION = '1.0.8'
81
105
 
82
106
 
83
- ### Logging
107
+ ### Logging
84
108
  @default_logger = Logger.new( $stderr )
85
109
  @default_logger.level = $DEBUG ? Logger::DEBUG : Logger::WARN
86
110
 
@@ -161,7 +185,7 @@ module PluginFactory
161
185
  base = nil
162
186
  self.ancestors.each do |klass|
163
187
  if klass.instance_variables.include?( :@derivatives ) ||
164
- klass.instance_variables.include?( "@derivatives" )
188
+ klass.instance_variables.include?( "@derivatives" )
165
189
  base = klass
166
190
  break
167
191
  end
@@ -6,67 +6,26 @@ BEGIN {
6
6
  basedir = Pathname.new( __FILE__ ).dirname.parent
7
7
 
8
8
  libdir = basedir + "lib"
9
- extdir = basedir + "ext"
10
9
 
11
10
  $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
11
  }
14
12
 
15
- require 'erb'
13
+ require 'rspec'
14
+ require 'pluginfactory'
16
15
 
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
16
 
17
+ ### RSpec helper functions.
18
+ module PluginFactory
62
19
 
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()
20
+ # An alternate formatter for Logger instances that outputs +div+ HTML
21
+ # fragments.
22
+ # @private
23
+ class HtmlLogFormatter < Logger::Formatter
24
+ include ERB::Util # for html_escape()
66
25
 
67
- unless defined?( HTML_LOG_FORMAT )
26
+ # The default HTML fragment that'll be used as the template for each log message.
68
27
  HTML_LOG_FORMAT = %q{
69
- <dd class="log-message %5$s">
28
+ <div class="log-message %5$s">
70
29
  <span class="log-time">%1$s.%2$06d</span>
71
30
  [
72
31
  <span class="log-pid">%3$d</span>
@@ -77,171 +36,122 @@ class HtmlLogFormatter < Logger::Formatter
77
36
  :
78
37
  <span class="log-name">%6$s</span>
79
38
  <span class="log-message-text">%7$s</span>
80
- </dd>
39
+ </div>
81
40
  }
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
41
 
42
+ ### Override the logging formats with ones that generate HTML fragments
43
+ def initialize( logger, format=HTML_LOG_FORMAT ) # :notnew:
44
+ @logger = logger
45
+ @format = format
46
+ super()
47
+ end
48
+
49
+
50
+ ######
51
+ public
52
+ ######
118
53
 
119
- # Override the badly-structured output of the RSpec HTML formatter
120
- require 'spec/runner/formatter/html_formatter'
54
+ # The HTML fragment that will be used as a format() string for the log
55
+ attr_accessor :format
121
56
 
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
57
+
58
+ ### Return a log message composed out of the arguments formatted using the
59
+ ### formatter's format string
60
+ def call( severity, time, progname, msg )
61
+ args = [
62
+ time.strftime( '%Y-%m-%d %H:%M:%S' ), # %1$s
63
+ time.usec, # %2$d
64
+ Process.pid, # %3$d
65
+ Thread.current == Thread.main ? 'main' : Thread.object_id, # %4$s
66
+ severity.downcase, # %5$s
67
+ progname, # %6$s
68
+ html_escape( msg ).gsub(/\n/, '<br />') # %7$s
69
+ ]
70
+
71
+ return self.format % args
129
72
  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
73
+
74
+ end # class HtmlLogFormatter
75
+
76
+
77
+ ### Spec helper functions
78
+ module SpecHelpers
79
+
80
+ class ArrayLogger
81
+ ### Create a new ArrayLogger that will append content to +array+.
82
+ def initialize( array )
83
+ @array = array
84
+ end
85
+
86
+ ### Write the specified +message+ to the array.
87
+ def write( message )
88
+ @array << message
89
+ end
90
+
91
+ ### No-op -- this is here just so Logger doesn't complain
92
+ def close; end
93
+
94
+ end # class ArrayLogger
95
+
96
+
97
+ unless defined?( LEVEL )
98
+ LEVEL = {
99
+ :debug => Logger::DEBUG,
100
+ :info => Logger::INFO,
101
+ :warn => Logger::WARN,
102
+ :error => Logger::ERROR,
103
+ :fatal => Logger::FATAL,
104
+ }
135
105
  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>"
106
+
107
+ ###############
108
+ module_function
109
+ ###############
110
+
111
+ ### Make an easily-comparable version vector out of +ver+ and return it.
112
+ def vvec( ver )
113
+ return ver.split('.').collect {|char| char.to_i }.pack('N*')
148
114
  end
149
115
 
150
- if extra = extra_failure_content( failure )
151
- @output.puts( extra )
116
+
117
+ ### Reset the logging subsystem to its default state.
118
+ def reset_logging
119
+ PluginFactory.reset_logger
152
120
  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 ]
121
+
122
+
123
+ ### Alter the output of the default log formatter to be pretty in SpecMate output
124
+ def setup_logging( level=Logger::FATAL )
125
+
126
+ # Turn symbol-style level config into Logger's expected Fixnum level
127
+ if LEVEL.key?( level )
128
+ level = LEVEL[ level ]
129
+ end
130
+
131
+ logger = Logger.new( $stderr )
132
+ PluginFactory.logger = logger
133
+ PluginFactory.logger.level = level
134
+
135
+ # Only do this when executing from a spec in TextMate
136
+ if ENV['HTML_LOGGING'] || (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
137
+ Thread.current['logger-output'] = []
138
+ logdevice = ArrayLogger.new( Thread.current['logger-output'] )
139
+ PluginFactory.logger = Logger.new( logdevice )
140
+ # PluginFactory.logger.level = level
141
+ PluginFactory.logger.formatter = PluginFactory::HtmlLogFormatter.new( logger )
142
+ end
165
143
  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
144
 
145
+ end # module SpecHelpers
146
+
147
+ end # module PluginFactory
148
+
149
+
150
+ ### Mock with Rspec
151
+ RSpec.configure do |c|
152
+ c.mock_with :rspec
153
+ c.include( PluginFactory::SpecHelpers )
154
+ end
245
155
 
246
156
  # vim: set nosta noet ts=4 sw=4:
247
157