Feature #220
closedtest-coverage measurement
Description
=begin
遠藤です。
Ruby 本体にカバレッジ測定機能を提供するのはどうでしょうか。
具体的には、ソースごとの各行の実行回数を表す定数 COVERAGE__ を
導入したいです。SCRIPT_LINES__ のカバレッジ版のようなイメージです。
- ユーザが COVERAGE__ に {} を設定する
- ユーザがソースファイルを require や load する
- COVERAGE__[ファイル名] が各行の実行回数を表す配列を返すようになる
(この配列は実行に従って勝手に更新される)
※ COVERAGE__ が設定されなければ何もしません。
※ 空行など実行される可能性がない行は nil になります。
※ eval は測定対象にしません。
動作の具体例です。
$ cat foo.rb
s = 0
10.times do |x|
s += x
end
if s == 45
p :ok
else
p :ng
end
$ ./ruby -e 'COVERAGE__ = {}; require "foo.rb"; p COVERAGE__'
:ok
{"/home/mame/work/ruby19/ruby/foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}
この配列は各行の実行回数を表しています。
上記の仕様を実装したものを添付します。
サンプルとして、lib/coverage.rb を同梱しています。
以下のように使えます。
$ ./ruby -rcoverage foo.rb
$ cat foo.rb.cov
1: 0:s = 0
1: 1:10.times do |x|
10: 2: s += x
-: 3:end
-: 4:
1: 5:if s == 45
1: 6: p :ok
-: 7:else
#####: 8: p :ng
-: 9:end
また、RUNRUBYOPT="-rcoverage" make test-all した結果を集計して
みました。バグとかで不正確な結果になってる可能性はありますが、
このくらいは動くと言うことで。
$ ./ruby -e '
aan = acn = 0
Dir["{lib,.ext}/**/*.cov"].each do |f|
an, cn = File.readlines(f).inject([0, 0]) do |(an, cn), l|
next [an, cn] if l.start_with?(" -")
an += 1
cn += 1 if !l.start_with?(" #####")
[an, cn]
end
puts "%s %.2f%% (%d/%d)" % [f, cn.to_f * 100 / an, cn, an]
aan += an
acn += cn
end
puts "(total) %.2f%% (%d/%d)" % [acn.to_f * 100 / aan, acn, aan]
'
lib/drb/unix.rb.cov 86.11% (62/72)
lib/drb/drb.rb.cov 81.70% (491/601)
lib/drb/eq.rb.cov 100.00% (9/9)
lib/drb/ssl.rb.cov 83.90% (99/118)
lib/drb/acl.rb.cov 85.71% (66/77)
lib/drb/extservm.rb.cov 96.23% (51/53)
lib/drb/invokemethod.rb.cov 27.78% (5/18)
lib/irb/notifier.rb.cov 75.00% (54/72)
lib/irb/output-method.rb.cov 52.00% (13/25)
lib/irb/slex.rb.cov 20.39% (31/152)
lib/net/https.rb.cov 77.78% (14/18)
lib/net/http.rb.cov 87.73% (772/880)
lib/net/imap.rb.cov 35.81% (467/1304)
lib/net/protocol.rb.cov 59.49% (116/195)
lib/rss/content/1.0.rb.cov 100.00% (6/6)
lib/rss/content/2.0.rb.cov 100.00% (7/7)
lib/rss/1.0.rb.cov 98.08% (204/208)
lib/rss/image.rb.cov 96.26% (103/107)
lib/rss/syndication.rb.cov 96.55% (28/29)
lib/rss/maker/1.0.rb.cov 99.55% (223/224)
lib/rss/maker/image.rb.cov 100.00% (58/58)
lib/rss/maker/syndication.rb.cov 100.00% (10/10)
lib/rss/maker/taxonomy.rb.cov 97.67% (42/43)
lib/rss/maker/0.9.rb.cov 98.79% (245/248)
lib/rss/maker/2.0.rb.cov 98.45% (127/129)
lib/rss/maker/base.rb.cov 98.22% (441/449)
lib/rss/maker/dublincore.rb.cov 100.00% (42/42)
lib/rss/maker/entry.rb.cov 97.89% (93/95)
lib/rss/maker/feed.rb.cov 98.28% (228/232)
lib/rss/maker/itunes.rb.cov 97.62% (123/126)
lib/rss/maker/slash.rb.cov 100.00% (18/18)
lib/rss/maker/atom.rb.cov 98.73% (78/79)
lib/rss/maker/trackback.rb.cov 100.00% (31/31)
lib/rss/maker/content.rb.cov 100.00% (12/12)
lib/rss/taxonomy.rb.cov 98.75% (79/80)
lib/rss/rexmlparser.rb.cov 82.14% (23/28)
lib/rss/parser.rb.cov 93.00% (279/300)
lib/rss/0.9.rb.cov 99.51% (205/206)
lib/rss/xmlparser.rb.cov 6.67% (3/45)
lib/rss/utils.rb.cov 98.31% (58/59)
lib/rss/2.0.rb.cov 100.00% (49/49)
lib/rss/dublincore.rb.cov 100.00% (39/39)
lib/rss/xml.rb.cov 89.74% (35/39)
lib/rss/xml-stylesheet.rb.cov 100.00% (63/63)
lib/rss/itunes.rb.cov 91.83% (191/208)
lib/rss/rss.rb.cov 93.23% (592/635)
lib/rss/slash.rb.cov 100.00% (25/25)
lib/rss/atom.rb.cov 99.50% (397/399)
lib/rss/dublincore/1.0.rb.cov 100.00% (9/9)
lib/rss/dublincore/2.0.rb.cov 100.00% (8/8)
lib/rss/dublincore/atom.rb.cov 100.00% (10/10)
lib/rss/maker.rb.cov 96.55% (28/29)
lib/rss/trackback.rb.cov 100.00% (125/125)
lib/rss/xmlscanner.rb.cov 1.64% (1/61)
lib/rss/content.rb.cov 100.00% (19/19)
lib/rss/converter.rb.cov 30.00% (21/70)
lib/uri/ftp.rb.cov 82.46% (47/57)
lib/uri/ldaps.rb.cov 100.00% (5/5)
lib/uri/https.rb.cov 100.00% (5/5)
lib/uri/common.rb.cov 95.07% (135/142)
lib/uri/generic.rb.cov 90.04% (416/462)
lib/uri/ldap.rb.cov 74.23% (72/97)
lib/uri/http.rb.cov 93.33% (14/15)
lib/uri/mailto.rb.cov 81.40% (70/86)
lib/date/format.rb.cov 35.96% (233/648)
lib/rdoc/ri/paths.rb.cov 57.50% (23/40)
lib/rdoc/ri/display.rb.cov 81.89% (104/127)
lib/rdoc/ri/formatter.rb.cov 69.23% (216/312)
lib/rdoc/ri/driver.rb.cov 13.45% (30/223)
lib/rdoc/options.rb.cov 31.82% (70/220)
lib/rdoc/ri.rb.cov 100.00% (2/2)
lib/rdoc/rdoc.rb.cov 32.74% (37/113)
lib/rdoc/dot.rb.cov 47.06% (40/85)
lib/rdoc/markup.rb.cov 92.86% (117/126)
lib/rdoc/tokenstream.rb.cov 58.33% (7/12)
lib/rdoc/markup/lines.rb.cov 95.00% (57/60)
lib/rdoc/markup/to_flow.rb.cov 49.44% (44/89)
lib/rdoc/markup/to_test.rb.cov 100.00% (23/23)
lib/rdoc/markup/fragments.rb.cov 95.89% (140/146)
lib/rdoc/markup/inline.rb.cov 76.60% (36/47)
lib/rdoc/markup/attribute_manager.rb.cov 90.08% (118/131)
lib/rdoc/markup/preprocess.rb.cov 24.14% (7/29)
lib/rdoc/markup/formatter.rb.cov 83.33% (5/6)
lib/rdoc/stats.rb.cov 58.33% (7/12)
lib/rdoc/parsers/parse_c.rb.cov 49.80% (125/251)
lib/rdoc/parsers/parse_rb.rb.cov 13.46% (178/1322)
lib/rdoc/parsers/parse_simple.rb.cov 43.75% (7/16)
lib/rdoc/parsers/parse_f95.rb.cov 6.02% (53/881)
lib/rdoc/parsers/parserfactory.rb.cov 41.67% (10/24)
lib/rdoc/code_objects.rb.cov 57.22% (218/381)
lib/rdoc/diagram.rb.cov 10.00% (14/140)
lib/test/unit/ui/console/testrunner.rb.cov 92.96% (66/71)
lib/test/unit/ui/testrunnermediator.rb.cov 100.00% (32/32)
lib/test/unit/ui/testrunnerutilities.rb.cov 66.67% (10/15)
lib/test/unit/collector/objectspace.rb.cov 100.00% (18/18)
lib/test/unit/collector/dir.rb.cov 95.89% (70/73)
lib/test/unit/util/backtracefilter.rb.cov 100.00% (28/28)
lib/test/unit/util/observable.rb.cov 100.00% (31/31)
lib/test/unit/util/procwrapper.rb.cov 100.00% (12/12)
lib/test/unit/failure.rb.cov 95.00% (19/20)
lib/test/unit/testcase.rb.cov 91.78% (67/73)
lib/test/unit/testsuite.rb.cov 100.00% (31/31)
lib/test/unit/collector.rb.cov 100.00% (25/25)
lib/test/unit/autorunner.rb.cov 66.94% (81/121)
lib/test/unit/testresult.rb.cov 100.00% (30/30)
lib/test/unit/error.rb.cov 95.24% (20/21)
lib/test/unit/assertions.rb.cov 97.01% (227/234)
lib/test/unit/assertionfailederror.rb.cov 100.00% (3/3)
lib/test/unit.rb.cov 90.91% (10/11)
lib/yaml/rubytypes.rb.cov 74.58% (176/236)
lib/yaml/syck.rb.cov 100.00% (6/6)
lib/yaml/store.rb.cov 95.83% (23/24)
lib/yaml/tag.rb.cov 88.89% (16/18)
lib/yaml/stream.rb.cov 61.11% (11/18)
lib/yaml/constants.rb.cov 100.00% (15/15)
lib/yaml/types.rb.cov 49.02% (50/102)
lib/yaml/ypath.rb.cov 92.59% (25/27)
lib/yaml/error.rb.cov 100.00% (18/18)
lib/yaml/basenode.rb.cov 15.38% (16/104)
lib/tempfile.rb.cov 79.59% (78/98)
lib/rdoc.rb.cov 100.00% (11/11)
lib/fileutils.rb.cov 81.93% (544/664)
lib/rexml/node.rb.cov 44.44% (16/36)
lib/rexml/rexml.rb.cov 100.00% (7/7)
lib/rexml/attribute.rb.cov 72.22% (52/72)
lib/rexml/streamlistener.rb.cov 100.00% (16/16)
lib/rexml/parseexception.rb.cov 28.57% (8/28)
lib/rexml/syncenumerator.rb.cov 50.00% (7/14)
lib/rexml/undefinednamespaceexception.rb.cov 80.00% (4/5)
lib/rexml/encodings/UTF-8.rb.cov 100.00% (10/10)
lib/rexml/encodings/ICONV.rb.cov 100.00% (13/13)
lib/rexml/text.rb.cov 47.13% (74/157)
lib/rexml/xpath_parser.rb.cov 33.78% (125/370)
lib/rexml/functions.rb.cov 27.39% (43/157)
lib/rexml/encoding.rb.cov 73.33% (33/45)
lib/rexml/validation/validationexception.rb.cov 80.00% (4/5)
lib/rexml/source.rb.cov 54.92% (67/122)
lib/rexml/document.rb.cov 68.75% (55/80)
lib/rexml/xpath.rb.cov 80.65% (25/31)
lib/rexml/formatters/pretty.rb.cov 22.22% (16/72)
lib/rexml/formatters/default.rb.cov 78.43% (40/51)
lib/rexml/element.rb.cov 45.36% (181/399)
lib/rexml/doctype.rb.cov 37.60% (47/125)
lib/rexml/instruction.rb.cov 56.25% (18/32)
lib/rexml/attlistdecl.rb.cov 60.00% (12/20)
lib/rexml/entity.rb.cov 52.94% (45/85)
lib/rexml/parsers/baseparser.rb.cov 61.00% (183/300)
lib/rexml/parsers/xpathparser.rb.cov 45.59% (181/397)
lib/rexml/parsers/streamparser.rb.cov 83.33% (20/24)
lib/rexml/parsers/treeparser.rb.cov 51.72% (30/58)
lib/rexml/xmldecl.rb.cov 80.88% (55/68)
lib/rexml/comment.rb.cov 51.85% (14/27)
lib/rexml/output.rb.cov 61.54% (8/13)
lib/rexml/cdata.rb.cov 55.00% (11/20)
lib/rexml/xmltokens.rb.cov 100.00% (9/9)
lib/rexml/parent.rb.cov 58.67% (44/75)
lib/rexml/namespace.rb.cov 81.82% (18/22)
lib/rexml/child.rb.cov 70.00% (21/30)
lib/rinda/tuplespace.rb.cov 66.67% (152/228)
lib/rinda/rinda.rb.cov 67.47% (56/83)
lib/delegate.rb.cov 54.44% (49/90)
lib/ostruct.rb.cov 58.93% (33/56)
lib/pathname.rb.cov 83.97% (309/368)
lib/pp.rb.cov 41.95% (146/348)
lib/open-uri.rb.cov 18.48% (61/330)
lib/e2mmap.rb.cov 68.29% (28/41)
lib/rubygems/source_index.rb.cov 94.12% (208/221)
lib/rubygems/ext/rake_builder.rb.cov 90.91% (10/11)
lib/rubygems/ext/ext_conf_builder.rb.cov 100.00% (8/8)
lib/rubygems/ext/builder.rb.cov 100.00% (27/27)
lib/rubygems/ext/configure_builder.rb.cov 100.00% (8/8)
lib/rubygems/spec_fetcher.rb.cov 96.23% (102/106)
lib/rubygems/dependency_list.rb.cov 86.76% (59/68)
lib/rubygems/command_manager.rb.cov 85.39% (76/89)
lib/rubygems/package.rb.cov 64.81% (35/54)
lib/rubygems/server.rb.cov 78.66% (129/164)
lib/rubygems/exceptions.rb.cov 100.00% (28/28)
lib/rubygems/command.rb.cov 90.18% (147/163)
lib/rubygems/source_info_cache.rb.cov 93.20% (137/147)
lib/rubygems/rubygems_version.rb.cov 100.00% (2/2)
lib/rubygems/install_update_options.rb.cov 94.74% (36/38)
lib/rubygems/source_info_cache_entry.rb.cov 91.30% (21/23)
lib/rubygems/security.rb.cov 72.99% (100/137)
lib/rubygems/version.rb.cov 98.25% (56/57)
lib/rubygems/remote_fetcher.rb.cov 90.28% (130/144)
lib/rubygems/config_file.rb.cov 94.12% (112/119)
lib/rubygems/dependency.rb.cov 95.12% (39/41)
lib/rubygems/local_remote_options.rb.cov 97.73% (43/44)
lib/rubygems/digest/md5.rb.cov 50.00% (4/8)
lib/rubygems/digest/sha2.rb.cov 66.67% (4/6)
lib/rubygems/digest/sha1.rb.cov 66.67% (4/6)
lib/rubygems/commands/mirror_command.rb.cov 14.55% (8/55)
lib/rubygems/commands/fetch_command.rb.cov 85.71% (30/35)
lib/rubygems/commands/outdated_command.rb.cov 100.00% (19/19)
lib/rubygems/commands/pristine_command.rb.cov 95.00% (38/40)
lib/rubygems/commands/unpack_command.rb.cov 89.74% (35/39)
lib/rubygems/commands/dependency_command.rb.cov 89.58% (86/96)
lib/rubygems/commands/server_command.rb.cov 94.12% (16/17)
lib/rubygems/commands/cert_command.rb.cov 100.00% (45/45)
lib/rubygems/commands/update_command.rb.cov 64.84% (59/91)
lib/rubygems/commands/specification_command.rb.cov 88.10% (37/42)
lib/rubygems/commands/generate_index_command.rb.cov 41.18% (7/17)
lib/rubygems/commands/stale_command.rb.cov 93.75% (15/16)
lib/rubygems/commands/contents_command.rb.cov 91.89% (34/37)
lib/rubygems/commands/build_command.rb.cov 96.55% (28/29)
lib/rubygems/commands/sources_command.rb.cov 92.41% (73/79)
lib/rubygems/commands/query_command.rb.cov 98.33% (118/120)
lib/rubygems/commands/install_command.rb.cov 81.67% (49/60)
lib/rubygems/commands/check_command.rb.cov 33.33% (14/42)
lib/rubygems/commands/uninstall_command.rb.cov 66.67% (22/33)
lib/rubygems/commands/environment_command.rb.cov 95.45% (42/44)
lib/rubygems/uninstaller.rb.cov 15.46% (15/97)
lib/rubygems/installer.rb.cov 97.99% (195/199)
lib/rubygems/indexer.rb.cov 14.88% (25/168)
lib/rubygems/defaults.rb.cov 80.95% (17/21)
lib/rubygems/builder.rb.cov 91.67% (33/36)
lib/rubygems/format.rb.cov 92.59% (25/27)
lib/rubygems/gem_runner.rb.cov 51.61% (16/31)
lib/rubygems/package/tar_writer.rb.cov 98.89% (89/90)
lib/rubygems/package/tar_input.rb.cov 79.81% (83/104)
lib/rubygems/package/tar_reader/entry.rb.cov 100.00% (50/50)
lib/rubygems/package/tar_header.rb.cov 100.00% (63/63)
lib/rubygems/package/f_sync_dir.rb.cov 85.71% (6/7)
lib/rubygems/package/tar_output.rb.cov 86.27% (44/51)
lib/rubygems/package/tar_reader.rb.cov 84.62% (33/39)
lib/rubygems/gem_openssl.rb.cov 67.86% (19/28)
lib/rubygems/ext.rb.cov 100.00% (6/6)
lib/rubygems/user_interaction.rb.cov 83.19% (99/119)
lib/rubygems/dependency_installer.rb.cov 93.75% (105/112)
lib/rubygems/require_paths_builder.rb.cov 40.00% (4/10)
lib/rubygems/version_option.rb.cov 100.00% (17/17)
lib/rubygems/platform.rb.cov 94.57% (87/92)
lib/rubygems/requirement.rb.cov 100.00% (61/61)
lib/rubygems/gem_path_searcher.rb.cov 100.00% (19/19)
lib/rubygems/test_utilities.rb.cov 100.00% (54/54)
lib/rubygems/doc_manager.rb.cov 63.16% (48/76)
lib/rubygems/specification.rb.cov 90.23% (397/440)
lib/rubygems/validator.rb.cov 35.96% (32/89)
lib/date.rb.cov 48.27% (307/636)
lib/singleton.rb.cov 24.44% (33/135)
lib/prettyprint.rb.cov 39.55% (157/397)
lib/timeout.rb.cov 70.73% (29/41)
lib/set.rb.cov 91.18% (186/204)
lib/rubygems.rb.cov 91.90% (261/284)
lib/erb.rb.cov 95.47% (274/287)
lib/webrick.rb.cov 100.00% (17/17)
lib/tmpdir.rb.cov 60.38% (32/53)
lib/shellwords.rb.cov 77.78% (28/36)
lib/monitor.rb.cov 87.65% (71/81)
lib/rss.rb.cov 100.00% (12/12)
lib/thread.rb.cov 76.86% (93/121)
lib/open3.rb.cov 59.26% (16/27)
lib/pstore.rb.cov 72.47% (129/178)
lib/find.rb.cov 82.61% (19/23)
lib/xmlrpc/config.rb.cov 100.00% (10/10)
lib/xmlrpc/server.rb.cov 48.29% (113/234)
lib/xmlrpc/create.rb.cov 78.18% (86/110)
lib/xmlrpc/parser.rb.cov 51.20% (213/416)
lib/xmlrpc/utils.rb.cov 57.58% (38/66)
lib/xmlrpc/datetime.rb.cov 100.00% (36/36)
lib/xmlrpc/marshal.rb.cov 100.00% (29/29)
lib/xmlrpc/client.rb.cov 57.14% (100/175)
lib/xmlrpc/base64.rb.cov 80.00% (12/15)
lib/uri.rb.cov 100.00% (11/11)
lib/forwardable.rb.cov 75.00% (15/20)
lib/optparse.rb.cov 77.87% (482/619)
lib/yaml.rb.cov 72.53% (66/91)
lib/webrick/config.rb.cov 100.00% (13/13)
lib/webrick/server.rb.cov 77.31% (92/119)
lib/webrick/httprequest.rb.cov 90.53% (220/243)
lib/webrick/utils.rb.cov 90.72% (88/97)
lib/webrick/compat.rb.cov 100.00% (4/4)
lib/webrick/httpauth/digestauth.rb.cov 14.78% (30/203)
lib/webrick/httpauth/basicauth.rb.cov 86.11% (31/36)
lib/webrick/httpauth/htpasswd.rb.cov 93.33% (42/45)
lib/webrick/httpauth/htdigest.rb.cov 26.92% (14/52)
lib/webrick/httpauth/htgroup.rb.cov 27.27% (9/33)
lib/webrick/httpauth/authenticator.rb.cov 86.96% (40/46)
lib/webrick/httpauth/userdb.rb.cov 80.00% (8/10)
lib/webrick/version.rb.cov 100.00% (2/2)
lib/webrick/log.rb.cov 84.78% (39/46)
lib/webrick/httpservlet.rb.cov 100.00% (9/9)
lib/webrick/https.rb.cov 69.70% (23/33)
lib/webrick/httpproxy.rb.cov 83.77% (129/154)
lib/webrick/httputils.rb.cov 78.50% (168/214)
lib/webrick/ssl.rb.cov 60.29% (41/68)
lib/webrick/htmlutils.rb.cov 100.00% (10/10)
lib/webrick/httpservlet/filehandler.rb.cov 80.59% (191/237)
lib/webrick/httpservlet/prochandler.rb.cov 100.00% (11/11)
lib/webrick/httpservlet/abstract.rb.cov 71.43% (25/35)
lib/webrick/httpservlet/cgihandler.rb.cov 80.88% (55/68)
lib/webrick/httpservlet/erbhandler.rb.cov 38.46% (10/26)
lib/webrick/httpserver.rb.cov 87.68% (121/138)
lib/webrick/httpversion.rb.cov 90.00% (18/20)
lib/webrick/httpstatus.rb.cov 88.10% (37/42)
lib/webrick/httpauth.rb.cov 95.45% (21/22)
lib/webrick/httpresponse.rb.cov 67.93% (125/184)
lib/webrick/cookie.rb.cov 92.54% (62/67)
lib/webrick/accesslog.rb.cov 82.93% (34/41)
lib/logger.rb.cov 79.69% (153/192)
lib/cgi.rb.cov 17.86% (115/644)
lib/scanf.rb.cov 98.43% (188/191)
lib/ipaddr.rb.cov 78.35% (181/231)
lib/time.rb.cov 38.83% (160/412)
lib/English.rb.cov 100.00% (25/25)
lib/tsort.rb.cov 57.75% (41/71)
lib/rational.rb.cov 100.00% (10/10)
.ext/common/io/nonblock.rb.cov 64.29% (9/14)
.ext/common/json/add/core.rb.cov 97.83% (45/46)
.ext/common/json/add/rails.rb.cov 42.86% (9/21)
.ext/common/json/version.rb.cov 100.00% (7/7)
.ext/common/json/common.rb.cov 64.71% (77/119)
.ext/common/json/ext.rb.cov 100.00% (8/8)
.ext/common/openssl.rb.cov 100.00% (6/6)
.ext/common/ripper.rb.cov 100.00% (4/4)
.ext/common/digest/hmac.rb.cov 90.24% (37/41)
.ext/common/digest/sha2.rb.cov 46.43% (13/28)
.ext/common/ripper/lexer.rb.cov 60.56% (43/71)
.ext/common/ripper/sexp.rb.cov 90.48% (19/21)
.ext/common/ripper/filter.rb.cov 41.67% (10/24)
.ext/common/ripper/core.rb.cov 93.75% (15/16)
.ext/common/kconv.rb.cov 94.29% (66/70)
.ext/common/json.rb.cov 77.78% (7/9)
.ext/common/openssl/x509.rb.cov 83.33% (70/84)
.ext/common/openssl/ssl.rb.cov 95.65% (88/92)
.ext/common/openssl/cipher.rb.cov 81.82% (18/22)
.ext/common/openssl/buffering.rb.cov 83.09% (113/136)
.ext/common/openssl/bn.rb.cov 83.33% (5/6)
.ext/common/openssl/digest.rb.cov 95.24% (20/21)
.ext/common/digest.rb.cov 58.33% (14/24)
(total) 66.40% (23543/35456)
ご検討お願いします。
--
Yusuke ENDOH mame@tsg.ne.jp
Attachment: coverage.patch
=end