hbase-jruby 0.1.1-java

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.
@@ -0,0 +1,211 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path('..', __FILE__)
4
+ require 'helper'
5
+
6
+ class TestScoped < TestHBaseJRubyBase
7
+ def test_table
8
+ @hbase.table(TABLE) do |table|
9
+ assert_equal TABLE, table.name
10
+ assert table.exists?
11
+ end
12
+
13
+ table = @hbase.table(TABLE)
14
+ 2.times do
15
+ assert_equal TABLE, table.name
16
+ assert table.exists?
17
+ table.close
18
+ table.close
19
+
20
+ # Gets another HTable instance from HTablePool
21
+ table.put('rowkey' => { 'cf1:a' => 1 })
22
+ end
23
+ end
24
+
25
+ def test_put_then_get
26
+ bignum = 123456789123456789123456789
27
+ # Single record put
28
+ assert_equal 1, @table.put('row1',
29
+ 'cf1:a' => 2,
30
+ 'cf1:b' => 'b',
31
+ 'cf1:c' => 6.28,
32
+ 'cf1:d' => false,
33
+ 'cf1:e' => bignum + 1,
34
+ 'cf1:f' => :bol,
35
+ 'cf1:g' => BigDecimal.new("456.123"),
36
+ 'cf1:str1' => "Goodbye", 'cf1:str2' => "Cruel world")
37
+ assert_equal 1, @table.put('row1',
38
+ 'cf1:a' => 1,
39
+ 'cf1:b' => 'a',
40
+ 'cf1:c' => 3.14,
41
+ 'cf1:d' => true,
42
+ 'cf1:e' => bignum,
43
+ 'cf1:f' => :sym,
44
+ 'cf1:g' => BigDecimal.new("123.456"),
45
+ 'cf1:str1' => "Hello", 'cf1:str2' => "World")
46
+ # Batch put
47
+ assert_equal 2, @table.put(
48
+ 'row2' => { 'cf1:a' => 2, 'cf1:b' => 'b', 'cf1:c' => 6.28 },
49
+ 'row3' => { 'cf1:a' => 4, 'cf1:b' => 'c', 'cf1:c' => 6.28 })
50
+
51
+ # single-get (latest version)
52
+ assert_equal 'row1', @table.get('row1').rowkey
53
+ assert_equal 1, @table.get('row1').fixnum('cf1:a')
54
+ assert_equal 'a', @table.get('row1').string('cf1:b')
55
+ assert_equal 'a', String.from_java_bytes(@table.get('row1').raw('cf1:b'))
56
+ assert_equal 3.14, @table.get('row1').float('cf1:c')
57
+ assert_equal true, @table.get('row1').boolean('cf1:d')
58
+ assert_equal bignum, @table.get('row1').bignum('cf1:e')
59
+ assert_equal :sym, @table.get('row1').symbol('cf1:f')
60
+ assert_equal BigDecimal.new("123.456"), @table.get('row1').bigdecimal('cf1:g')
61
+
62
+ # single-get-multi-col
63
+ assert_equal %w[Hello World], @table.get('row1').string(['cf1:str1', 'cf1:str2'])
64
+
65
+ # single-get-multi-ver
66
+ assert_equal [1, 2], @table.get('row1').fixnums('cf1:a').values
67
+ assert_equal %w[a b], @table.get('row1').strings('cf1:b').values
68
+ assert_equal %w[a b], @table.get('row1').raws('cf1:b').values.map { |v| String.from_java_bytes v }
69
+ assert_equal [3.14, 6.28], @table.get('row1').floats('cf1:c').values
70
+ assert_equal [true, false], @table.get('row1').booleans('cf1:d').values
71
+ assert_equal [bignum, bignum + 1], @table.get('row1').bignums('cf1:e').values
72
+ assert_equal [:sym, :bol], @table.get('row1').symbols('cf1:f').values
73
+ assert_equal [
74
+ BigDecimal.new("123.456"),
75
+ BigDecimal.new("456.123")], @table.get('row1').bigdecimals('cf1:g').values
76
+
77
+ assert @table.get('row1').fixnums('cf1:a').keys.all? { |k| k.instance_of? Fixnum }
78
+
79
+ # single-get-multi-col-multi=ver
80
+ ret = @table.get('row1').strings(['cf1:str1', 'cf1:str2'])
81
+ assert_equal ['Hello', 'World'], ret.map(&:values).map(&:first)
82
+ assert_equal ['Goodbye', 'Cruel world'], ret.map(&:values).map(&:last)
83
+
84
+ # multi-get
85
+ assert_equal %w[row1 row2 row3], @table.get(['row1', 'row2', 'row3']).map { |r| r.rowkey }
86
+ assert_equal [1, 2, 4 ], @table.get(['row1', 'row2', 'row3']).map { |r| r.integer('cf1:a') }
87
+ assert_equal [3.14, 6.28, 6.28], @table.get(['row1', 'row2', 'row3']).map { |r| r.float('cf1:c') }
88
+ assert_equal [nil, nil ], @table.get(['xxx', 'yyy'])
89
+
90
+ # Unavailable columns
91
+ assert_equal nil, @table.get('row1').symbol('cf1:xxx')
92
+ assert_equal nil, @table.get('row1').integer('cf1:xxx')
93
+
94
+ # Row not found
95
+ assert_equal nil, @table.get('xxx')
96
+ end
97
+
98
+ def test_to_hash
99
+ data = {
100
+ 'cf1:a' => 'Hello',
101
+ 'cf1:b' => 200,
102
+ 'cf1:c' => 3.14,
103
+ 'cf2:d' => :world,
104
+ 'cf2:e' => false,
105
+ 'cf3:f' => 1234567890123456789012345678901234567890,
106
+ 'cf3' => true
107
+ }
108
+ schema = {
109
+ 'cf1:a' => :string,
110
+ 'cf1:b' => :integer,
111
+ 'cf1:c' => :float,
112
+ HBase::ColumnKey(:cf2, :d) => :symbol,
113
+ HBase::ColumnKey(:cf2, :e) => :boolean,
114
+ HBase::ColumnKey(:cf3, :f) => :biginteger,
115
+ 'cf3' => :boolean
116
+ }
117
+ @table.put('row1', data)
118
+ @table.put('row2', 'cf1:a' => 'Goodbye')
119
+
120
+ assert_equal data, @table.get('row1').to_hash(schema).map { |k, v| { k.to_s => v } }.inject(:merge)
121
+ assert_equal 1, @table.get('row1').to_hash_with_versions(schema)['cf1:a'].length
122
+ assert_equal 1, @table.get('row1').to_hash_with_versions(schema)[HBase::ColumnKey(:cf1, :a)].length
123
+
124
+ # Better testing for versioned values
125
+ @table.put('row1', data)
126
+ assert_equal data, @table.get('row1').to_hash(schema).map { |k, v| { k.to_s => v } }.inject(:merge)
127
+
128
+ assert_equal 2, @table.get('row1').to_hash_with_versions(schema)['cf1:a'].length
129
+ assert_equal 1, @table.get('row1').to_hash_with_versions(schema)['cf3:f'].length
130
+
131
+ # get option: :versions
132
+ assert_equal 1, @table.versions(1).get('row1').to_hash_with_versions(schema)['cf1:a'].length
133
+
134
+ # scoped get with filters
135
+ assert_equal 2, @table.get(['row1', 'row2']).count
136
+ assert_equal 2, @table.range('row1'...'row2').get(['row1', 'row2']).count
137
+ assert_equal 2, @table.range('row1'..'row2').get(['row1', 'row2']).compact.count
138
+ assert_equal 1, @table.range('row1'...'row2').get(['row1', 'row2']).compact.count
139
+ assert_equal 1, @table.range(:prefix => 'row2').get(['row1', 'row2']).compact.count
140
+ assert_equal 1, @table.filter('cf1:a' => 'Hello').get(['row1', 'row2']).compact.count
141
+
142
+ # scoped get with projection
143
+ assert_equal %w[cf3 cf3:f], @table.project('cf3').get('row1').to_hash.keys.map(&:to_s)
144
+ end
145
+
146
+ def test_increment
147
+ @table.put('row1', 'cf1:counter' => 1, 'cf1:counter2' => 100)
148
+ assert_equal 1, @table.get('row1').fixnum('cf1:counter')
149
+
150
+ @table.increment('row1', 'cf1:counter', 1)
151
+ assert_equal 2, @table.get('row1').int('cf1:counter')
152
+
153
+ @table.increment('row1', 'cf1:counter', 2)
154
+ assert_equal 4, @table.get('row1').integer('cf1:counter')
155
+
156
+ # Multi-column increment
157
+ @table.increment('row1', 'cf1:counter' => 4, 'cf1:counter2' => 100)
158
+ assert_equal 8, @table.get('row1').integer('cf1:counter')
159
+ assert_equal 200, @table.get('row1').integer('cf1:counter2')
160
+ end
161
+
162
+ def test_delete
163
+ @table.put('row1', 'cf1' => 0, 'cf1:a' => 1, 'cf1:b' => 2, 'cf2:c' => 3, 'cf2:d' => 4)
164
+ sleep 0.1
165
+ @table.put('row1', 'cf2:d' => 5)
166
+ sleep 0.1
167
+ @table.put('row1', 'cf2:d' => 6)
168
+ versions = @table.get('row1').to_hash_with_versions['cf2:d'].keys
169
+ assert versions[0] > versions[1]
170
+ assert versions[1] > versions[2]
171
+
172
+ # Deletes a version
173
+ @table.delete('row1', 'cf2:d', versions[0], versions[2])
174
+ new_versions = @table.get('row1').to_hash_with_versions['cf2:d'].keys
175
+ assert_equal new_versions, [versions[1]]
176
+
177
+ # Deletes a column
178
+ assert_equal 3, @table.get('row1').integer('cf2:c')
179
+ @table.delete('row1', 'cf2:c')
180
+ assert_nil @table.get('row1').to_hash['cf2:c']
181
+
182
+ # Deletes a column with empty qualifier
183
+ assert_equal 0, @table.get('row1').integer('cf1')
184
+ @table.delete('row1', 'cf1:')
185
+ assert_equal 1, @table.get('row1').integer('cf1:a')
186
+ assert_equal 2, @table.get('row1').integer('cf1:b')
187
+ assert_nil @table.get('row1').to_hash['cf1']
188
+ assert_nil @table.get('row1').to_hash['cf1:']
189
+
190
+ # Deletes a column family
191
+ assert_equal 1, @table.get('row1').integer('cf1:a')
192
+ assert_equal 2, @table.get('row1').integer('cf1:b')
193
+ @table.delete('row1', 'cf1') # No trailing colon
194
+ assert_nil @table.get('row1').to_hash['cf1:a']
195
+ assert_nil @table.get('row1').to_hash['cf1:b']
196
+
197
+ # Deletes a row
198
+ @table.delete('row1')
199
+ assert_nil @table.get('row1')
200
+
201
+ # Batch delete
202
+ @table.put('row2', 'cf1:a' => 1)
203
+ @table.put('row3', 'cf1:a' => 1, 'cf1:b' => 2)
204
+
205
+ @table.delete ['row2'], ['row3', 'cf1:a']
206
+ assert_nil @table.get('row2')
207
+ assert_nil @table.get('row3').to_hash['cf1:a']
208
+ assert_equal 2, @table.get('row3').integer('cf1:b')
209
+ end
210
+ end
211
+
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path('..', __FILE__)
4
+ require 'helper'
5
+
6
+ class TestTableAdmin < TestHBaseJRubyBase
7
+ def teardown
8
+ @table.drop! if @table.exists?
9
+ end
10
+
11
+ def test_create_table_symbol_string
12
+ t = @hbase.table(:test_hbase_jruby_create_table)
13
+ t.drop! if t.exists?
14
+ [ :cf, 'cf', :cf => {} ].each do |cf|
15
+ assert_false t.exists?
16
+ t.create! cf
17
+ assert t.exists?
18
+ t.drop!
19
+ end
20
+ end
21
+
22
+ def test_disable_and_drop
23
+ @table.disable!
24
+ @table.disable!
25
+ @table.drop!
26
+ assert_false @table.exists?
27
+ end
28
+
29
+ def test_create_table_props
30
+ max_fs = 1024 ** 3
31
+ @table.drop!
32
+ @table.create!({ :cf1 => {}, :cf2 => {} }, :max_filesize => max_fs)
33
+ assert_equal max_fs, @table.descriptor.get_max_file_size
34
+
35
+ max_fs = 300 * 1024 ** 2
36
+ @table.drop!
37
+ @table.create! :cf1, :max_filesize => max_fs
38
+ assert_equal max_fs, @table.descriptor.get_max_file_size
39
+ end
40
+
41
+ def test_create_table_invalid_input
42
+ @table.drop!
43
+ assert_raise(ArgumentError) do
44
+ @table.create! 3.14
45
+ end
46
+
47
+ assert_raise(ArgumentError) do
48
+ @table.create! :cf1 => { :bloom => 'by beach house' }
49
+ end
50
+
51
+ assert_raise(ArgumentError) do
52
+ @table.create! :cf1 => { :bloomfilter => :xxx }
53
+ end
54
+ end
55
+
56
+ def test_enabled_disabled
57
+ assert @table.enabled?
58
+ assert !@table.disabled?
59
+ @table.disable!
60
+ assert !@table.enabled?
61
+ assert @table.disabled?
62
+ @table.enable!
63
+ assert @table.enabled?
64
+ assert !@table.disabled?
65
+ end
66
+
67
+ # def test_rename!
68
+ # new_name = TABLE + '_new'
69
+ # @table.rename! new_name
70
+ # assert_equal new_name, @table.name
71
+ # assert_equal new_name, @table.descriptor.get_name_as_string
72
+ # @table.drop!
73
+ # end
74
+
75
+ def test_table_properties
76
+ assert_raise(ArgumentError) do
77
+ @table.alter! :hello => :world
78
+ end
79
+
80
+ max_fs = 512 * 1024 ** 2
81
+ mem_fs = 64 * 1024 ** 2
82
+
83
+ @table.alter!(
84
+ :max_filesize => max_fs,
85
+ :memstore_flushsize => mem_fs,
86
+ :readonly => false,
87
+ :deferred_log_flush => true
88
+ )
89
+
90
+ assert_equal max_fs, @table.descriptor.get_max_file_size
91
+ assert_equal mem_fs, @table.descriptor.get_mem_store_flush_size
92
+ assert_equal false, @table.descriptor.is_read_only
93
+ assert_equal true, @table.descriptor.is_deferred_log_flush
94
+ end
95
+
96
+ def test_column_family_alteration!
97
+ assert @table.descriptor.getFamilies.map(&:getNameAsString).include?('cf2')
98
+ @table.delete_family! :cf2
99
+ assert !@table.descriptor.getFamilies.map(&:getNameAsString).include?('cf2')
100
+ @table.add_family! :cf4, {}
101
+ assert @table.descriptor.getFamilies.map(&:getNameAsString).include?('cf4')
102
+
103
+ # TODO: test more props
104
+ @table.alter_family! :cf4, :versions => 10
105
+ assert_equal 10, @table.descriptor.getFamilies.select { |cf| cf.getNameAsString == 'cf4' }.first.getMaxVersions
106
+
107
+ assert_raise(ArgumentError) {
108
+ @table.alter_family! :cf4, :hello => 'world'
109
+ }
110
+ assert_raise(ArgumentError) {
111
+ @table.alter_family! :cf4, :bloomfilter => :xxx
112
+ }
113
+ end
114
+
115
+ def test_inspect
116
+ @table.drop!
117
+ assert "{NAME => '#{TABLE}'}", @table.inspect # FIXME
118
+
119
+ @table.create! :cf => {
120
+ :blockcache => true,
121
+ :blocksize => 128 * 1024,
122
+ :bloomfilter => :row,
123
+ :compression => :snappy,
124
+ # :data_block_encoding => org.apache.hadoop.hbase.io.encoding.DataBlockEncoding::DIFF,
125
+ # :encode_on_disk => true,
126
+ # :keep_deleted_cells => true,
127
+ :in_memory => true,
128
+ :min_versions => 5,
129
+ :replication_scope => 0,
130
+ :ttl => 100,
131
+ :versions => 10,
132
+ }
133
+ props = eval @table.inspect.gsub(/([A-Z_]+) =>/) { ":#{$1.downcase} =>" }
134
+ assert_equal TABLE, props[:name]
135
+ cf = props[:families].first
136
+ assert_equal 'cf', cf[:name]
137
+ assert_equal 'ROW', cf[:bloomfilter]
138
+ assert_equal '0', cf[:replication_scope]
139
+ assert_equal '10', cf[:versions]
140
+ assert_equal 'SNAPPY', cf[:compression]
141
+ assert_equal '5', cf[:min_versions]
142
+ assert_equal '100', cf[:ttl]
143
+ assert_equal '131072', cf[:blocksize]
144
+ assert_equal 'true', cf[:in_memory]
145
+ assert_equal 'true', cf[:blockcache]
146
+ end
147
+ end
148
+
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path('..', __FILE__)
4
+ require 'helper'
5
+ require 'bigdecimal'
6
+
7
+ class TestUtil < Test::Unit::TestCase
8
+ Util = HBase::Util
9
+
10
+ def test_bytea_conversion
11
+ Util.import_java_classes!
12
+
13
+ [:fixnum, :int, :integer].each do |type|
14
+ assert_equal 100, Util.from_bytes( type, Util.to_bytes(100) )
15
+ end
16
+ [:float, :double].each do |type|
17
+ assert_equal 3.14, Util.from_bytes( type, Util.to_bytes(3.14) )
18
+ end
19
+ [:bignum, :biginteger, :bigint].each do |type|
20
+ assert_equal 12345678901234567890, Util.from_bytes( type, Util.to_bytes(12345678901234567890) )
21
+ end
22
+ [:string, :str].each do |type|
23
+ assert_equal "Hello", Util.from_bytes( type, Util.to_bytes("Hello") )
24
+ end
25
+ [:bool, :boolean].each do |type|
26
+ assert_equal true, Util.from_bytes( type, Util.to_bytes(true) )
27
+ assert_equal false, Util.from_bytes( type, Util.to_bytes(false) )
28
+ end
29
+ [:symbol, :sym].each do |type|
30
+ assert_equal :hello, Util.from_bytes( type, Util.to_bytes(:hello) )
31
+ end
32
+
33
+ bd = BigDecimal.new("123456789.123456789")
34
+ jbd = java.math.BigDecimal.new("9876543210.987654321")
35
+ [:bigdecimal].each do |type|
36
+ assert_equal bd, Util.from_bytes( type, Util.to_bytes(bd) )
37
+ assert_equal jbd, Util.from_bytes( type, Util.to_bytes(jbd) )
38
+ end
39
+
40
+ assert_equal String.from_java_bytes("asdf".to_java_bytes),
41
+ String.from_java_bytes( Util.from_bytes( :raw, "asdf".to_java_bytes ) )
42
+
43
+ assert_equal 0, Util.to_bytes(nil).length
44
+
45
+ assert_raise(ArgumentError) { Util.from_bytes(:xxx, [].to_java(Java::byte)) }
46
+ assert_raise(ArgumentError) { Util.to_bytes({}) }
47
+ end
48
+
49
+ def test_parse_column_name
50
+ assert_equal ['abc', 'def'], parse_to_str('abc:def')
51
+ assert_equal ['abc', 'def:'], parse_to_str('abc:def:')
52
+ assert_equal ['abc', ''], parse_to_str('abc:')
53
+ assert_equal ['abc', nil], parse_to_str('abc')
54
+ assert_equal ['abc', ':::'], parse_to_str('abc::::')
55
+
56
+ assert_equal [:abc, :def], parse_to_str([:abc, :def], :symbol)
57
+ assert_equal [123, 456], parse_to_str([123, 456], :fixnum)
58
+ assert_equal ['abc', 'def'], parse_to_str(
59
+ org.apache.hadoop.hbase.KeyValue.new(
60
+ 'rowkey'.to_java_bytes,
61
+ 'abc'.to_java_bytes,
62
+ 'def'.to_java_bytes))
63
+
64
+ assert_equal [:abc, :def], parse_to_str(HBase::ColumnKey.new(:abc, :def), :symbol)
65
+
66
+ assert_raise(ArgumentError) { Util.parse_column_name(nil) }
67
+ assert_raise(ArgumentError) { Util.parse_column_name('') }
68
+
69
+ assert_equal nil, Util.from_bytes(:string, nil)
70
+ end
71
+
72
+ def test_append_0
73
+ assert_equal [97, 97, 97, 0], Util.append_0("aaa".to_java_bytes).to_a
74
+ end
75
+
76
+ private
77
+ def parse_to_str v, type = :string
78
+ Util.parse_column_name(v).map { |e| Util.from_bytes type, e }
79
+ end
80
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hbase-jruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: java
7
+ authors:
8
+ - Junegunn Choi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: test-unit
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: simplecov
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: Ruby-esque interface for accessing HBase from JRuby
47
+ email:
48
+ - junegunn.c@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - .gitignore
54
+ - Gemfile
55
+ - LICENSE.txt
56
+ - README.md
57
+ - Rakefile
58
+ - hbase-jruby.gemspec
59
+ - lib/hbase-jruby.rb
60
+ - lib/hbase-jruby/admin.rb
61
+ - lib/hbase-jruby/byte_array.rb
62
+ - lib/hbase-jruby/cell.rb
63
+ - lib/hbase-jruby/column_key.rb
64
+ - lib/hbase-jruby/dependency.rb
65
+ - lib/hbase-jruby/hbase.rb
66
+ - lib/hbase-jruby/pom/cdh3u5.xml
67
+ - lib/hbase-jruby/pom/cdh4.1.2.xml
68
+ - lib/hbase-jruby/result.rb
69
+ - lib/hbase-jruby/scoped.rb
70
+ - lib/hbase-jruby/table.rb
71
+ - lib/hbase-jruby/util.rb
72
+ - lib/hbase-jruby/version.rb
73
+ - test/helper.rb
74
+ - test/test_byte_array.rb
75
+ - test/test_cell.rb
76
+ - test/test_column_key.rb
77
+ - test/test_hbase.rb
78
+ - test/test_scoped.rb
79
+ - test/test_table.rb
80
+ - test/test_table_admin.rb
81
+ - test/test_util.rb
82
+ homepage: https://github.com/junegunn/hbase-jruby
83
+ licenses: []
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 1.8.24
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: Ruby-esque interface for accessing HBase from JRuby
106
+ test_files:
107
+ - test/helper.rb
108
+ - test/test_byte_array.rb
109
+ - test/test_cell.rb
110
+ - test/test_column_key.rb
111
+ - test/test_hbase.rb
112
+ - test/test_scoped.rb
113
+ - test/test_table.rb
114
+ - test/test_table_admin.rb
115
+ - test/test_util.rb
116
+ has_rdoc: