rroonga 0.9.4-x86-mingw32 → 0.9.5-x86-mingw32

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.
Files changed (153) hide show
  1. data/NEWS.ja.rdoc +29 -0
  2. data/NEWS.rdoc +29 -0
  3. data/Rakefile +6 -6
  4. data/ext/groonga/rb-grn-array.c +1 -1
  5. data/ext/groonga/rb-grn-context.c +15 -28
  6. data/ext/groonga/rb-grn-exception.c +46 -1
  7. data/ext/groonga/rb-grn-expression.c +22 -13
  8. data/ext/groonga/rb-grn-fix-size-column.c +2 -8
  9. data/ext/groonga/rb-grn-hash.c +8 -1
  10. data/ext/groonga/rb-grn-object.c +1 -1
  11. data/ext/groonga/rb-grn-patricia-trie.c +23 -1
  12. data/ext/groonga/rb-grn-table-key-support.c +22 -0
  13. data/ext/groonga/rb-grn-table.c +37 -5
  14. data/ext/groonga/rb-grn-utils.c +20 -2
  15. data/ext/groonga/rb-grn.h +1 -1
  16. data/ext/groonga/rb-groonga.c +76 -38
  17. data/extconf.rb +17 -1
  18. data/html/developer.html +32 -7
  19. data/html/footer.html.erb +5 -0
  20. data/html/heading-mark.svg +393 -0
  21. data/html/index.html +33 -3
  22. data/lib/1.8/groonga.so +0 -0
  23. data/lib/1.9/groonga.so +0 -0
  24. data/lib/groonga.rb +3 -7
  25. data/lib/groonga/context.rb +2 -13
  26. data/lib/groonga/expression-builder.rb +273 -67
  27. data/lib/groonga/pagination.rb +143 -0
  28. data/lib/groonga/record.rb +2 -0
  29. data/lib/groonga/schema.rb +140 -29
  30. data/pkg/rroonga-0.9.5/NEWS.ja.rdoc +156 -0
  31. data/pkg/rroonga-0.9.5/NEWS.rdoc +158 -0
  32. data/pkg/rroonga-0.9.5/README.ja.rdoc +65 -0
  33. data/pkg/rroonga-0.9.5/README.rdoc +66 -0
  34. data/pkg/rroonga-0.9.5/text/TUTORIAL.ja.rdoc +394 -0
  35. data/pkg/rroonga-0.9.5/text/expression.rdoc +285 -0
  36. data/rroonga-build.rb +2 -2
  37. data/test-unit/Rakefile +40 -0
  38. data/test-unit/TODO +5 -0
  39. data/test-unit/bin/testrb +5 -0
  40. data/test-unit/html/classic.html +15 -0
  41. data/test-unit/html/index.html +25 -0
  42. data/test-unit/html/index.html.ja +27 -0
  43. data/test-unit/lib/test/unit.rb +323 -0
  44. data/test-unit/lib/test/unit/assertionfailederror.rb +25 -0
  45. data/test-unit/lib/test/unit/assertions.rb +1230 -0
  46. data/test-unit/lib/test/unit/attribute.rb +125 -0
  47. data/test-unit/lib/test/unit/autorunner.rb +360 -0
  48. data/test-unit/lib/test/unit/collector.rb +36 -0
  49. data/test-unit/lib/test/unit/collector/descendant.rb +23 -0
  50. data/test-unit/lib/test/unit/collector/dir.rb +108 -0
  51. data/test-unit/lib/test/unit/collector/load.rb +144 -0
  52. data/test-unit/lib/test/unit/collector/objectspace.rb +34 -0
  53. data/test-unit/lib/test/unit/color-scheme.rb +102 -0
  54. data/test-unit/lib/test/unit/color.rb +96 -0
  55. data/test-unit/lib/test/unit/diff.rb +724 -0
  56. data/test-unit/lib/test/unit/error.rb +130 -0
  57. data/test-unit/lib/test/unit/exceptionhandler.rb +39 -0
  58. data/test-unit/lib/test/unit/failure.rb +136 -0
  59. data/test-unit/lib/test/unit/fixture.rb +176 -0
  60. data/test-unit/lib/test/unit/notification.rb +129 -0
  61. data/test-unit/lib/test/unit/omission.rb +191 -0
  62. data/test-unit/lib/test/unit/pending.rb +150 -0
  63. data/test-unit/lib/test/unit/priority.rb +180 -0
  64. data/test-unit/lib/test/unit/runner/console.rb +52 -0
  65. data/test-unit/lib/test/unit/runner/emacs.rb +8 -0
  66. data/test-unit/lib/test/unit/runner/tap.rb +8 -0
  67. data/test-unit/lib/test/unit/testcase.rb +476 -0
  68. data/test-unit/lib/test/unit/testresult.rb +89 -0
  69. data/test-unit/lib/test/unit/testsuite.rb +110 -0
  70. data/test-unit/lib/test/unit/ui/console/outputlevel.rb +14 -0
  71. data/test-unit/lib/test/unit/ui/console/testrunner.rb +466 -0
  72. data/test-unit/lib/test/unit/ui/emacs/testrunner.rb +63 -0
  73. data/test-unit/lib/test/unit/ui/tap/testrunner.rb +92 -0
  74. data/test-unit/lib/test/unit/ui/testrunner.rb +28 -0
  75. data/test-unit/lib/test/unit/ui/testrunnermediator.rb +77 -0
  76. data/test-unit/lib/test/unit/ui/testrunnerutilities.rb +41 -0
  77. data/test-unit/lib/test/unit/util/backtracefilter.rb +41 -0
  78. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  79. data/test-unit/lib/test/unit/util/observable.rb +90 -0
  80. data/test-unit/lib/test/unit/util/procwrapper.rb +48 -0
  81. data/test-unit/lib/test/unit/version.rb +7 -0
  82. data/test-unit/sample/adder.rb +13 -0
  83. data/test-unit/sample/subtracter.rb +12 -0
  84. data/test-unit/sample/test_adder.rb +20 -0
  85. data/test-unit/sample/test_subtracter.rb +20 -0
  86. data/test-unit/sample/test_user.rb +23 -0
  87. data/test-unit/test/collector/test-descendant.rb +133 -0
  88. data/test-unit/test/collector/test-load.rb +442 -0
  89. data/test-unit/test/collector/test_dir.rb +406 -0
  90. data/test-unit/test/collector/test_objectspace.rb +100 -0
  91. data/test-unit/test/run-test.rb +15 -0
  92. data/test-unit/test/test-attribute.rb +86 -0
  93. data/test-unit/test/test-color-scheme.rb +67 -0
  94. data/test-unit/test/test-color.rb +47 -0
  95. data/test-unit/test/test-diff.rb +518 -0
  96. data/test-unit/test/test-emacs-runner.rb +60 -0
  97. data/test-unit/test/test-fixture.rb +287 -0
  98. data/test-unit/test/test-notification.rb +33 -0
  99. data/test-unit/test/test-omission.rb +81 -0
  100. data/test-unit/test/test-pending.rb +70 -0
  101. data/test-unit/test/test-priority.rb +119 -0
  102. data/test-unit/test/test-testcase.rb +544 -0
  103. data/test-unit/test/test_assertions.rb +1151 -0
  104. data/test-unit/test/test_error.rb +26 -0
  105. data/test-unit/test/test_failure.rb +33 -0
  106. data/test-unit/test/test_testresult.rb +113 -0
  107. data/test-unit/test/test_testsuite.rb +129 -0
  108. data/test-unit/test/testunit-test-util.rb +14 -0
  109. data/test-unit/test/ui/test_testrunmediator.rb +20 -0
  110. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  111. data/test-unit/test/util/test_backtracefilter.rb +41 -0
  112. data/test-unit/test/util/test_observable.rb +102 -0
  113. data/test-unit/test/util/test_procwrapper.rb +36 -0
  114. data/test/groonga-test-utils.rb +3 -2
  115. data/test/run-test.rb +14 -2
  116. data/test/test-column.rb +7 -7
  117. data/test/test-context-select.rb +34 -11
  118. data/test/test-exception.rb +3 -0
  119. data/test/test-expression-builder.rb +11 -0
  120. data/test/test-expression.rb +3 -6
  121. data/test/test-gqtp.rb +3 -5
  122. data/test/test-pagination.rb +249 -0
  123. data/test/test-record.rb +36 -8
  124. data/test/test-remote.rb +11 -4
  125. data/test/test-schema-create-table.rb +251 -0
  126. data/test/test-schema.rb +4 -24
  127. data/test/test-table-offset-and-limit.rb +3 -5
  128. data/test/test-table-select-mecab.rb +80 -0
  129. data/test/test-table-select-weight.rb +104 -0
  130. data/test/test-table.rb +22 -4
  131. data/test/test-version.rb +1 -1
  132. data/text/TUTORIAL.ja.rdoc +2 -0
  133. data/text/expression.rdoc +1 -0
  134. data/vendor/local/bin/grntest.exe +0 -0
  135. data/vendor/local/bin/groonga.exe +0 -0
  136. data/vendor/local/bin/libgroonga-0.dll +0 -0
  137. data/vendor/local/include/{groonga.h → groonga/groonga.h} +93 -32
  138. data/vendor/local/lib/groonga/modules/functions/cast.dll +0 -0
  139. data/vendor/local/lib/groonga/modules/functions/cast.la +41 -0
  140. data/vendor/local/lib/pkgconfig/groonga.pc +12 -0
  141. data/vendor/local/share/groonga/admin_html/css/admin.css +104 -0
  142. data/vendor/local/share/groonga/admin_html/css/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
  143. data/vendor/local/share/groonga/admin_html/index.html +1355 -0
  144. data/vendor/local/share/groonga/admin_html/js/jquery-1.4.2.min.js +154 -0
  145. data/vendor/local/share/groonga/admin_html/js/jquery-ui-1.8.1.custom.min.js +756 -0
  146. data/vendor/local/share/groonga/munin/plugins/groonga_cpu_load +47 -0
  147. data/vendor/local/share/groonga/munin/plugins/groonga_cpu_time +57 -0
  148. data/vendor/local/share/groonga/munin/plugins/groonga_disk +162 -0
  149. data/vendor/local/share/groonga/munin/plugins/groonga_memory +51 -0
  150. data/vendor/local/share/groonga/munin/plugins/groonga_n_records +110 -0
  151. data/vendor/local/share/groonga/munin/plugins/groonga_query_performance +133 -0
  152. data/vendor/local/share/groonga/munin/plugins/groonga_status +84 -0
  153. metadata +126 -36
@@ -0,0 +1,125 @@
1
+ module Test
2
+ module Unit
3
+ module Attribute
4
+ class << self
5
+ def included(base)
6
+ base.extend(BaseClassMethods)
7
+ base.extend(ClassMethods)
8
+ end
9
+ end
10
+
11
+ module BaseClassMethods
12
+ def attributes_table
13
+ {}
14
+ end
15
+ end
16
+
17
+ module ClassMethods
18
+ def method_added(name)
19
+ super
20
+ return unless defined?(@current_attributes)
21
+
22
+ attributes = {}
23
+ kept_attributes = {}
24
+ @current_attributes.each do |attribute_name, attribute|
25
+ attributes[attribute_name] = attribute[:value]
26
+ kept_attributes[attribute_name] = attribute if attribute[:keep]
27
+ end
28
+ set_attributes(name, attributes)
29
+ @current_attributes = kept_attributes
30
+ end
31
+
32
+ def attribute(name, value, options={}, *method_names)
33
+ unless options.is_a?(Hash)
34
+ method_names << options
35
+ options = {}
36
+ end
37
+ @current_attributes ||= {}
38
+ if method_names.empty?
39
+ @current_attributes[name] = options.merge(:value => value)
40
+ else
41
+ method_names.each do |method_name|
42
+ set_attributes(method_name, {name => value})
43
+ end
44
+ end
45
+ end
46
+
47
+ def attributes_table
48
+ @attributes_table ||= {}
49
+ super.merge(@attributes_table)
50
+ end
51
+
52
+ def set_attributes(method_name, new_attributes)
53
+ return if new_attributes.empty?
54
+ method_name = normalize_method_name(method_name)
55
+ @attributes_table ||= {}
56
+ @attributes_table[method_name] ||= {}
57
+ current_attributes = @attributes_table[method_name]
58
+ new_attributes.each do |key, value|
59
+ key = normalize_attribute_name(key)
60
+ observers = attribute_observers(key) || []
61
+ observers.each do |observer|
62
+ observer.call(self,
63
+ key,
64
+ (attributes(method_name) || {})[key],
65
+ value,
66
+ method_name)
67
+ end
68
+ current_attributes[key] = value
69
+ end
70
+ end
71
+
72
+ def attributes(method_name)
73
+ method_name = normalize_method_name(method_name)
74
+ attributes = attributes_table[method_name]
75
+ ancestors[1..-1].each do |ancestor|
76
+ if ancestor.is_a?(Class) and ancestor < Test::Unit::Attribute
77
+ parent_attributes = ancestor.attributes(method_name)
78
+ if attributes
79
+ attributes = (parent_attributes || {}).merge(attributes)
80
+ else
81
+ attributes = parent_attributes
82
+ end
83
+ break
84
+ end
85
+ end
86
+ attributes
87
+ end
88
+
89
+ def get_attribute(method_name, attribute_name)
90
+ attribute_name = normalize_attribute_name(attribute_name)
91
+ (attributes(method_name) || {})[attribute_name]
92
+ end
93
+
94
+ @@attribute_observers = {}
95
+ def register_attribute_observer(attribute_name, observer=Proc.new)
96
+ attribute_name = normalize_attribute_name(attribute_name)
97
+ @@attribute_observers[attribute_name] ||= []
98
+ @@attribute_observers[attribute_name] << observer
99
+ end
100
+
101
+ def attribute_observers(attribute_name)
102
+ attribute_name = normalize_attribute_name(attribute_name)
103
+ @@attribute_observers[attribute_name]
104
+ end
105
+
106
+ private
107
+ def normalize_attribute_name(name)
108
+ name.to_s
109
+ end
110
+
111
+ def normalize_method_name(name)
112
+ name.to_s
113
+ end
114
+ end
115
+
116
+ def attributes
117
+ self.class.attributes(@method_name) || {}
118
+ end
119
+
120
+ def [](name)
121
+ self.class.get_attribute(@method_name, name)
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,360 @@
1
+ require 'test/unit/color-scheme'
2
+ require 'optparse'
3
+
4
+ module Test
5
+ module Unit
6
+ class AutoRunner
7
+ RUNNERS = {}
8
+ COLLECTORS = {}
9
+ ADDITIONAL_OPTIONS = []
10
+
11
+ class << self
12
+ def register_runner(id, runner_builder=Proc.new)
13
+ RUNNERS[id] = runner_builder
14
+ RUNNERS[id.to_s] = runner_builder
15
+ end
16
+
17
+ def runner(id)
18
+ RUNNERS[id.to_s]
19
+ end
20
+
21
+ @@default_runner = nil
22
+ def default_runner
23
+ runner(@@default_runner)
24
+ end
25
+
26
+ def default_runner=(id)
27
+ @@default_runner = id
28
+ end
29
+
30
+ def register_collector(id, collector_builder=Proc.new)
31
+ COLLECTORS[id] = collector_builder
32
+ COLLECTORS[id.to_s] = collector_builder
33
+ end
34
+
35
+ def collector(id)
36
+ COLLECTORS[id.to_s]
37
+ end
38
+
39
+ def register_color_scheme(id, scheme)
40
+ ColorScheme[id] = scheme
41
+ end
42
+
43
+ def setup_option(option_builder=Proc.new)
44
+ ADDITIONAL_OPTIONS << option_builder
45
+ end
46
+ end
47
+
48
+ def self.run(force_standalone=false, default_dir=nil, argv=ARGV, &block)
49
+ r = new(force_standalone || standalone?, &block)
50
+ r.base = default_dir
51
+ r.process_args(argv)
52
+ r.run
53
+ end
54
+
55
+ def self.standalone?
56
+ return false unless("-e" == $0)
57
+ ObjectSpace.each_object(Class) do |klass|
58
+ return false if(klass < TestCase)
59
+ end
60
+ true
61
+ end
62
+
63
+ register_collector(:descendant) do |auto_runner|
64
+ require 'test/unit/collector/descendant'
65
+ collector = Collector::Descendant.new
66
+ collector.filter = auto_runner.filters
67
+ collector.collect($0.sub(/\.rb\Z/, ''))
68
+ end
69
+
70
+ register_collector(:load) do |auto_runner|
71
+ require 'test/unit/collector/load'
72
+ collector = Collector::Load.new
73
+ collector.patterns.concat(auto_runner.pattern) if auto_runner.pattern
74
+ collector.excludes.concat(auto_runner.exclude) if auto_runner.exclude
75
+ collector.base = auto_runner.base
76
+ collector.filter = auto_runner.filters
77
+ collector.collect(*auto_runner.to_run)
78
+ end
79
+
80
+ # deprecated
81
+ register_collector(:object_space) do |auto_runner|
82
+ require 'test/unit/collector/objectspace'
83
+ c = Collector::ObjectSpace.new
84
+ c.filter = auto_runner.filters
85
+ c.collect($0.sub(/\.rb\Z/, ''))
86
+ end
87
+
88
+ # deprecated
89
+ register_collector(:dir) do |auto_runner|
90
+ require 'test/unit/collector/dir'
91
+ c = Collector::Dir.new
92
+ c.filter = auto_runner.filters
93
+ c.pattern.concat(auto_runner.pattern) if auto_runner.pattern
94
+ c.exclude.concat(auto_runner.exclude) if auto_runner.exclude
95
+ c.base = auto_runner.base
96
+ $:.push(auto_runner.base) if auto_runner.base
97
+ c.collect(*(auto_runner.to_run.empty? ? ['.'] : auto_runner.to_run))
98
+ end
99
+
100
+ attr_reader :suite, :runner_options
101
+ attr_accessor :filters, :to_run, :pattern, :exclude, :base, :workdir
102
+ attr_accessor :color_scheme
103
+ attr_writer :runner, :collector
104
+
105
+ def initialize(standalone)
106
+ Unit.run = true
107
+ @standalone = standalone
108
+ @runner = default_runner
109
+ @collector = default_collector
110
+ @filters = []
111
+ @to_run = []
112
+ @color_scheme = ColorScheme.default
113
+ @runner_options = {}
114
+ @default_arguments = []
115
+ @workdir = nil
116
+ config_file = "test-unit.yml"
117
+ if File.exist?(config_file)
118
+ load_config(config_file)
119
+ else
120
+ load_global_config
121
+ end
122
+ yield(self) if block_given?
123
+ end
124
+
125
+ def process_args(args = ARGV)
126
+ begin
127
+ args.unshift(*@default_arguments)
128
+ options.order!(args) {|arg| @to_run << arg}
129
+ rescue OptionParser::ParseError => e
130
+ puts e
131
+ puts options
132
+ exit(false)
133
+ end
134
+ not @to_run.empty?
135
+ end
136
+
137
+ def options
138
+ @options ||= OptionParser.new do |o|
139
+ o.banner = "Test::Unit automatic runner."
140
+ o.banner << "\nUsage: #{$0} [options] [-- untouched arguments]"
141
+
142
+ o.on
143
+ o.on('-r', '--runner=RUNNER', RUNNERS,
144
+ "Use the given RUNNER.",
145
+ "(" + keyword_display(RUNNERS) + ")") do |r|
146
+ @runner = r
147
+ end
148
+
149
+ if (@standalone)
150
+ o.on('-b', '--basedir=DIR', "Base directory of test suites.") do |b|
151
+ @base = b
152
+ end
153
+
154
+ o.on('-w', '--workdir=DIR', "Working directory to run tests.") do |w|
155
+ @workdir = w
156
+ end
157
+
158
+ o.on('-a', '--add=TORUN', Array,
159
+ "Add TORUN to the list of things to run;",
160
+ "can be a file or a directory.") do |a|
161
+ @to_run.concat(a)
162
+ end
163
+
164
+ @pattern = []
165
+ o.on('-p', '--pattern=PATTERN', Regexp,
166
+ "Match files to collect against PATTERN.") do |e|
167
+ @pattern << e
168
+ end
169
+
170
+ @exclude = []
171
+ o.on('-x', '--exclude=PATTERN', Regexp,
172
+ "Ignore files to collect against PATTERN.") do |e|
173
+ @exclude << e
174
+ end
175
+ end
176
+
177
+ o.on('-n', '--name=NAME', String,
178
+ "Runs tests matching NAME.",
179
+ "(patterns may be used).") do |n|
180
+ n = (%r{\A/(.*)/\Z} =~ n ? Regexp.new($1) : n)
181
+ case n
182
+ when Regexp
183
+ @filters << proc{|t| n =~ t.method_name ? true : false}
184
+ else
185
+ @filters << proc{|t| n == t.method_name}
186
+ end
187
+ end
188
+
189
+ o.on('-t', '--testcase=TESTCASE', String,
190
+ "Runs tests in TestCases matching TESTCASE.",
191
+ "(patterns may be used).") do |n|
192
+ n = (%r{\A/(.*)/\Z} =~ n ? Regexp.new($1) : n)
193
+ case n
194
+ when Regexp
195
+ @filters << proc{|t| n =~ t.class.name ? true : false}
196
+ else
197
+ @filters << proc{|t| n == t.class.name}
198
+ end
199
+ end
200
+
201
+ priority_filter = Proc.new do |test|
202
+ if @filters == [priority_filter]
203
+ Priority::Checker.new(test).need_to_run?
204
+ else
205
+ nil
206
+ end
207
+ end
208
+ o.on("--[no-]priority-mode",
209
+ "Runs some tests based on their priority.") do |priority_mode|
210
+ if priority_mode
211
+ Priority.enable
212
+ @filters |= [priority_filter]
213
+ else
214
+ Priority.disable
215
+ @filters -= [priority_filter]
216
+ end
217
+ end
218
+
219
+ o.on("--default-priority=PRIORITY",
220
+ Priority.available_values,
221
+ "Uses PRIORITY as default priority",
222
+ "(#{keyword_display(Priority.available_values)})") do |priority|
223
+ Priority.default = priority
224
+ end
225
+
226
+ o.on('-I', "--load-path=DIR[#{File::PATH_SEPARATOR}DIR...]",
227
+ "Appends directory list to $LOAD_PATH.") do |dirs|
228
+ $LOAD_PATH.concat(dirs.split(File::PATH_SEPARATOR))
229
+ end
230
+
231
+ color_schemes = ColorScheme.all
232
+ o.on("--color-scheme=SCHEME", color_schemes,
233
+ "Use SCHEME as color scheme.",
234
+ "(#{keyword_display(color_schemes)})") do |scheme|
235
+ @color_scheme = scheme
236
+ end
237
+
238
+ o.on("--config=FILE",
239
+ "Use YAML fomat FILE content as configuration file.") do |file|
240
+ load_config(file)
241
+ end
242
+
243
+ o.on("--order=ORDER", TestCase::AVAILABLE_ORDERS,
244
+ "Run tests in a test case in ORDER order.",
245
+ "(#{keyword_display(TestCase::AVAILABLE_ORDERS)})") do |order|
246
+ TestCase.test_order = order
247
+ end
248
+
249
+ ADDITIONAL_OPTIONS.each do |option_builder|
250
+ option_builder.call(self, o)
251
+ end
252
+
253
+ o.on('--',
254
+ "Stop processing options so that the",
255
+ "remaining options will be passed to the",
256
+ "test."){o.terminate}
257
+
258
+ o.on('-h', '--help', 'Display this help.'){puts o; exit}
259
+
260
+ o.on_tail
261
+ o.on_tail('Deprecated options:')
262
+
263
+ o.on_tail('--console', 'Console runner (use --runner).') do
264
+ warn("Deprecated option (--console).")
265
+ @runner = self.class.runner(:console)
266
+ end
267
+
268
+ if RUNNERS[:fox]
269
+ o.on_tail('--fox', 'Fox runner (use --runner).') do
270
+ warn("Deprecated option (--fox).")
271
+ @runner = self.class.runner(:fox)
272
+ end
273
+ end
274
+
275
+ o.on_tail
276
+ end
277
+ end
278
+
279
+ def keyword_display(keywords)
280
+ keywords = keywords.collect do |keyword, _|
281
+ keyword.to_s
282
+ end.uniq.sort
283
+
284
+ i = 0
285
+ keywords.collect do |keyword|
286
+ if (i > 0 and keyword[0] == keywords[i - 1][0]) or
287
+ ((i < keywords.size - 1) and (keyword[0] == keywords[i + 1][0]))
288
+ n = 2
289
+ else
290
+ n = 1
291
+ end
292
+ i += 1
293
+ keyword.sub(/^(.{#{n}})([A-Za-z]+)(?=\w*$)/, '\\1[\\2]')
294
+ end.join(", ")
295
+ end
296
+
297
+ def run
298
+ suite = @collector[self]
299
+ return false if suite.nil?
300
+ runner = @runner[self]
301
+ return false if runner.nil?
302
+ @runner_options[:color_scheme] ||= @color_scheme
303
+ Dir.chdir(@workdir) if @workdir
304
+ runner.run(suite, @runner_options).passed?
305
+ end
306
+
307
+ def load_config(file)
308
+ require 'yaml'
309
+ config = YAML.load(File.read(file))
310
+ runner_name = config["runner"]
311
+ @runner = self.class.runner(runner_name) || @runner
312
+ @collector = self.class.collector(config["collector"]) || @collector
313
+ (config["color_schemes"] || {}).each do |name, options|
314
+ ColorScheme[name] = options
315
+ end
316
+ runner_options = {}
317
+ (config["#{runner_name}_options"] || {}).each do |key, value|
318
+ key = key.to_sym
319
+ value = ColorScheme[value] if key == :color_scheme
320
+ if key == :arguments
321
+ @default_arguments.concat(value.split)
322
+ else
323
+ runner_options[key.to_sym] = value
324
+ end
325
+ end
326
+ @runner_options = @runner_options.merge(runner_options)
327
+ end
328
+
329
+ private
330
+ def default_runner
331
+ runner = self.class.default_runner
332
+ if ENV["EMACS"] == "t"
333
+ runner ||= self.class.runner(:emacs)
334
+ else
335
+ runner ||= self.class.runner(:console)
336
+ end
337
+ runner
338
+ end
339
+
340
+ def default_collector
341
+ self.class.collector(@standalone ? :load : :descendant)
342
+ end
343
+
344
+ def global_config_file
345
+ File.expand_path("~/.test-unit.xml")
346
+ rescue ArgumentError
347
+ nil
348
+ end
349
+
350
+ def load_global_config
351
+ file = global_config_file
352
+ load_config(file) if file and File.exist?(file)
353
+ end
354
+ end
355
+ end
356
+ end
357
+
358
+ require 'test/unit/runner/console'
359
+ require 'test/unit/runner/emacs'
360
+ require 'test/unit/runner/tap'