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,36 @@
1
+ module Test
2
+ module Unit
3
+ module Collector
4
+ def initialize
5
+ @filters = []
6
+ end
7
+
8
+ def filter=(filters)
9
+ @filters = case(filters)
10
+ when Proc
11
+ [filters]
12
+ when Array
13
+ filters
14
+ end
15
+ end
16
+
17
+ def add_suite(destination, suite)
18
+ to_delete = suite.tests.find_all{|t| !include?(t)}
19
+ to_delete.each{|t| suite.delete(t)}
20
+ destination << suite unless(suite.size == 0)
21
+ end
22
+
23
+ def include?(test)
24
+ return true if(@filters.empty?)
25
+ @filters.each do |filter|
26
+ return false if filter[test] == false
27
+ end
28
+ true
29
+ end
30
+
31
+ def sort(suites)
32
+ suites.sort_by {|suite| suite.name || suite.to_s}
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ require 'test/unit/collector'
2
+
3
+ module Test
4
+ module Unit
5
+ module Collector
6
+ class Descendant
7
+ include Collector
8
+
9
+ NAME = 'collected from the subclasses of TestCase'
10
+
11
+ def collect(name=NAME)
12
+ suite = TestSuite.new(name)
13
+ sub_suites = []
14
+ TestCase::DESCENDANTS.each do |descendant_test_case|
15
+ add_suite(sub_suites, descendant_test_case.suite)
16
+ end
17
+ sort(sub_suites).each {|s| suite << s}
18
+ suite
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,108 @@
1
+ require 'test/unit/testsuite'
2
+ require 'test/unit/collector'
3
+
4
+ module Test
5
+ module Unit
6
+ module Collector
7
+ class Dir
8
+ include Collector
9
+
10
+ attr_reader :pattern, :exclude
11
+ attr_accessor :base
12
+
13
+ def initialize(dir=::Dir, file=::File, object_space=::ObjectSpace, req=nil)
14
+ super()
15
+ @dir = dir
16
+ @file = file
17
+ @object_space = object_space
18
+ @req = req
19
+ @pattern = [/\btest_.*\.rb\Z/m]
20
+ @exclude = []
21
+ @base = nil
22
+ end
23
+
24
+ def collect(*from)
25
+ basedir = @base
26
+ $:.push(basedir) if basedir
27
+ if(from.empty?)
28
+ recursive_collect('.', find_test_cases)
29
+ elsif(from.size == 1)
30
+ recursive_collect(from.first, find_test_cases)
31
+ else
32
+ suites = []
33
+ from.each do |f|
34
+ suite = recursive_collect(f, find_test_cases)
35
+ suites << suite unless(suite.tests.empty?)
36
+ end
37
+ suite = TestSuite.new("[#{from.join(', ')}]")
38
+ sort(suites).each{|s| suite << s}
39
+ suite
40
+ end
41
+ ensure
42
+ $:.delete_at($:.rindex(basedir)) if basedir
43
+ end
44
+
45
+ def find_test_cases(ignore=[])
46
+ cases = []
47
+ @object_space.each_object(Class) do |c|
48
+ cases << c if(c < TestCase && !ignore.include?(c))
49
+ end
50
+ ignore.concat(cases)
51
+ cases
52
+ end
53
+
54
+ def recursive_collect(name, already_gathered)
55
+ sub_suites = []
56
+ path = realdir(name)
57
+ if @file.directory?(path)
58
+ dir_name = name unless name == '.'
59
+ @dir.entries(path).each do |e|
60
+ next if(e == '.' || e == '..')
61
+ e_name = dir_name ? @file.join(dir_name, e) : e
62
+ if @file.directory?(realdir(e_name))
63
+ next if /\A(?:CVS|\.svn|\.git)\z/ =~ e
64
+ sub_suite = recursive_collect(e_name, already_gathered)
65
+ sub_suites << sub_suite unless(sub_suite.empty?)
66
+ else
67
+ next if /~\z/ =~ e_name or /\A\.\#/ =~ e
68
+ if @pattern and !@pattern.empty?
69
+ next unless @pattern.any? {|pat| pat =~ e_name}
70
+ end
71
+ if @exclude and !@exclude.empty?
72
+ next if @exclude.any? {|pat| pat =~ e_name}
73
+ end
74
+ collect_file(e_name, sub_suites, already_gathered)
75
+ end
76
+ end
77
+ else
78
+ collect_file(name, sub_suites, already_gathered)
79
+ end
80
+ suite = TestSuite.new(@file.basename(name))
81
+ sort(sub_suites).each{|s| suite << s}
82
+ suite
83
+ end
84
+
85
+ def collect_file(name, suites, already_gathered)
86
+ dir = @file.dirname(@file.expand_path(name, @base))
87
+ $:.unshift(dir)
88
+ if(@req)
89
+ @req.require(name)
90
+ else
91
+ require(name)
92
+ end
93
+ find_test_cases(already_gathered).each{|t| add_suite(suites, t.suite)}
94
+ ensure
95
+ $:.delete_at($:.rindex(dir)) if(dir)
96
+ end
97
+
98
+ def realdir(path)
99
+ if @base
100
+ @file.join(@base, path)
101
+ else
102
+ path
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,144 @@
1
+ require 'pathname'
2
+
3
+ require 'test/unit/testsuite'
4
+ require 'test/unit/collector'
5
+
6
+ module Test
7
+ module Unit
8
+ module Collector
9
+ class Load
10
+ include Collector
11
+
12
+ attr_reader :patterns, :excludes, :base
13
+
14
+ def initialize
15
+ super
16
+ @system_excludes = [/~\z/, /\A\.\#/]
17
+ @system_directory_excludes = [/\A(?:CVS|\.svn|\.git)\z/]
18
+ @patterns = [/\Atest[_\-].+\.rb\z/m, /[_\-]test\.rb\z/]
19
+ @excludes = []
20
+ @base = nil
21
+ end
22
+
23
+ def base=(base)
24
+ base = Pathname(base) unless base.nil?
25
+ @base = base
26
+ end
27
+
28
+ def collect(*froms)
29
+ add_load_path(@base) do
30
+ froms = ["."] if froms.empty?
31
+ test_suites = []
32
+ already_gathered = find_test_cases
33
+ froms.each do |from|
34
+ from = resolve_path(from)
35
+ if from.directory?
36
+ test_suite = collect_recursive(from, already_gathered)
37
+ test_suites << test_suite unless test_suite.tests.empty?
38
+ else
39
+ collect_file(from, test_suites, already_gathered)
40
+ end
41
+ end
42
+
43
+ if test_suites.size > 1
44
+ test_suite = TestSuite.new("[#{froms.join(', ')}]")
45
+ sort(test_suites).each do |sub_test_suite|
46
+ test_suite << sub_test_suite
47
+ end
48
+ test_suite
49
+ else
50
+ test_suites.first
51
+ end
52
+ end
53
+ end
54
+
55
+ def find_test_cases(ignore=[])
56
+ test_cases = []
57
+ TestCase::DESCENDANTS.each do |test_case|
58
+ test_cases << test_case unless ignore.include?(test_case)
59
+ end
60
+ ignore.concat(test_cases)
61
+ test_cases
62
+ end
63
+
64
+ private
65
+ def collect_recursive(path, already_gathered)
66
+ sub_test_suites = []
67
+
68
+ if path.directory?
69
+ directories, files = path.children.partition do |child|
70
+ child.directory?
71
+ end
72
+
73
+ files.each do |child|
74
+ next if excluded_file?(child.basename.to_s)
75
+ collect_file(child, sub_test_suites, already_gathered)
76
+ end
77
+
78
+ directories.each do |child|
79
+ next if excluded_directory?(child.basename.to_s)
80
+ sub_test_suite = collect_recursive(child, already_gathered)
81
+ sub_test_suites << sub_test_suite unless sub_test_suite.empty?
82
+ end
83
+ else
84
+ unless excluded_file?(path.basename.to_s)
85
+ collect_file(path, sub_test_suites, already_gathered)
86
+ end
87
+ end
88
+
89
+ test_suite = TestSuite.new(path.basename.to_s)
90
+ sort(sub_test_suites).each do |sub_test_suite|
91
+ test_suite << sub_test_suite
92
+ end
93
+ test_suite
94
+ end
95
+
96
+ def collect_file(path, test_suites, already_gathered)
97
+ @program_file ||= File.expand_path($0)
98
+ return if @program_file == path.to_s
99
+ add_load_path(path.expand_path.dirname) do
100
+ require(path.to_s)
101
+ find_test_cases(already_gathered).each do |test_case|
102
+ add_suite(test_suites, test_case.suite)
103
+ end
104
+ end
105
+ end
106
+
107
+ def resolve_path(path)
108
+ if @base
109
+ @base + path
110
+ else
111
+ Pathname(path)
112
+ end
113
+ end
114
+
115
+ def add_load_path(path)
116
+ $LOAD_PATH.push(path.to_s) if path
117
+ yield
118
+ ensure
119
+ $LOAD_PATH.delete_at($LOAD_PATH.rindex(path.to_s)) if path
120
+ end
121
+
122
+ def excluded_directory?(base)
123
+ @system_directory_excludes.any? {|pattern| pattern =~ base}
124
+ end
125
+
126
+ def excluded_file?(base)
127
+ return true if @system_excludes.any? {|pattern| pattern =~ base}
128
+
129
+ patterns = @patterns || []
130
+ unless patterns.empty?
131
+ return true unless patterns.any? {|pattern| pattern =~ base}
132
+ end
133
+
134
+ excludes = @excludes || []
135
+ unless excludes.empty?
136
+ return true if excludes.any? {|pattern| pattern =~ base}
137
+ end
138
+
139
+ false
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,34 @@
1
+ # Author:: Nathaniel Talbott.
2
+ # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
3
+ # License:: Ruby license.
4
+
5
+ require 'test/unit/collector'
6
+
7
+ module Test
8
+ module Unit
9
+ module Collector
10
+ class ObjectSpace
11
+ include Collector
12
+
13
+ NAME = 'collected from the ObjectSpace'
14
+
15
+ def initialize(source=::ObjectSpace)
16
+ super()
17
+ @source = source
18
+ end
19
+
20
+ def collect(name=NAME)
21
+ suite = TestSuite.new(name)
22
+ sub_suites = []
23
+ @source.each_object(Class) do |klass|
24
+ if(Test::Unit::TestCase > klass)
25
+ add_suite(sub_suites, klass.suite)
26
+ end
27
+ end
28
+ sort(sub_suites).each{|s| suite << s}
29
+ suite
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,102 @@
1
+ require 'test/unit/color'
2
+
3
+ module Test
4
+ module Unit
5
+ class ColorScheme
6
+ include Enumerable
7
+
8
+ class << self
9
+ @@default = nil
10
+ def default
11
+ @@default ||= new("success" => Color.new("green", :bold => true),
12
+ "failure" => Color.new("red", :bold => true),
13
+ "pending" => Color.new("magenta", :bold => true),
14
+ "omission" => Color.new("blue", :bold => true),
15
+ "notification" => Color.new("cyan", :bold => true),
16
+ "error" => Color.new("yellow", :bold => true) +
17
+ Color.new("black", :foreground => false),
18
+ "case" => Color.new("white", :bold => true) +
19
+ Color.new("blue", :foreground => false),
20
+ "suite" => Color.new("white", :bold => true) +
21
+ Color.new("green", :foreground => false),
22
+ "diff-inserted-tag" =>
23
+ Color.new("red", :bold => true),
24
+ "diff-deleted-tag" =>
25
+ Color.new("green", :bold => true),
26
+ "diff-difference-tag" =>
27
+ Color.new("cyan", :bold => true),
28
+ "diff-inserted" =>
29
+ Color.new("red", :foreground => false) +
30
+ Color.new("white", :bold => true),
31
+ "diff-deleted" =>
32
+ Color.new("green", :foreground => false) +
33
+ Color.new("white", :bold => true))
34
+ end
35
+
36
+ @@schemes = {}
37
+ def all
38
+ @@schemes.merge("default" => default)
39
+ end
40
+
41
+ def [](id)
42
+ @@schemes[id.to_s]
43
+ end
44
+
45
+ def []=(id, scheme_or_spec)
46
+ if scheme_or_spec.is_a?(self)
47
+ scheme = scheme_or_spec
48
+ else
49
+ scheme = new(scheme_or_spec)
50
+ end
51
+ @@schemes[id.to_s] = scheme
52
+ end
53
+ end
54
+
55
+ def initialize(scheme_spec)
56
+ @scheme = {}
57
+ scheme_spec.each do |key, color_spec|
58
+ self[key] = color_spec
59
+ end
60
+ end
61
+
62
+ def [](name)
63
+ @scheme[name.to_s]
64
+ end
65
+
66
+ def []=(name, color_spec)
67
+ @scheme[name.to_s] = make_color(color_spec)
68
+ end
69
+
70
+ def each(&block)
71
+ @scheme.each(&block)
72
+ end
73
+
74
+ def to_hash
75
+ hash = {}
76
+ @scheme.each do |key, color|
77
+ hash[key] = color
78
+ end
79
+ hash
80
+ end
81
+
82
+ private
83
+ def make_color(color_spec)
84
+ if color_spec.is_a?(Color) or color_spec.is_a?(MixColor)
85
+ color_spec
86
+ else
87
+ color_name = nil
88
+ normalized_color_spec = {}
89
+ color_spec.each do |key, value|
90
+ key = key.to_sym
91
+ if key == :name
92
+ color_name = value
93
+ else
94
+ normalized_color_spec[key] = value
95
+ end
96
+ end
97
+ Color.new(color_name, normalized_color_spec)
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end