kyototycoon 0.5.4 → 0.5.5

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.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ coverage/
data/Gemfile CHANGED
@@ -1,14 +1,3 @@
1
1
  source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
5
2
 
6
- # Add dependencies to develop your gem here.
7
- # Include everything needed to run rake, tests, features, etc.
8
- group :development do
9
- gem "rspec", "~> 2.1.0"
10
- gem "bundler", "~> 1.0.0"
11
- gem "jeweler", "~> 1.5.1"
12
- gem "rcov", ">= 0"
13
- gem "msgpack", ">= 0"
14
- end
3
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,15 +1,20 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ kyototycoon (0.5.5)
5
+ msgpack
6
+
1
7
  GEM
2
8
  remote: http://rubygems.org/
3
9
  specs:
4
10
  diff-lcs (1.1.2)
5
11
  git (1.2.5)
6
- jeweler (1.5.1)
12
+ jeweler (1.5.2)
7
13
  bundler (~> 1.0.0)
8
14
  git (>= 1.2.5)
9
15
  rake
10
- msgpack (0.4.4)
11
- rake (0.8.7)
12
- rcov (0.9.9)
16
+ msgpack (0.4.5)
17
+ rake (0.9.2)
13
18
  rspec (2.1.0)
14
19
  rspec-core (~> 2.1.0)
15
20
  rspec-expectations (~> 2.1.0)
@@ -18,6 +23,9 @@ GEM
18
23
  rspec-expectations (2.1.0)
19
24
  diff-lcs (~> 1.1.2)
20
25
  rspec-mocks (2.1.0)
26
+ simplecov (0.4.2)
27
+ simplecov-html (~> 0.4.4)
28
+ simplecov-html (0.4.5)
21
29
 
22
30
  PLATFORMS
23
31
  ruby
@@ -25,6 +33,6 @@ PLATFORMS
25
33
  DEPENDENCIES
26
34
  bundler (~> 1.0.0)
27
35
  jeweler (~> 1.5.1)
28
- msgpack
29
- rcov
36
+ kyototycoon!
30
37
  rspec (~> 2.1.0)
38
+ simplecov
data/kyototycoon.gemspec CHANGED
@@ -1,78 +1,49 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
5
3
 
6
4
  Gem::Specification.new do |s|
7
5
  s.name = %q{kyototycoon}
8
- s.version = "0.5.4"
6
+ s.version = "0.5.5"
9
7
 
10
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
9
  s.authors = ["uu59"]
12
- s.date = %q{2011-06-29}
10
+ s.date = %q{2011-07-30}
13
11
  s.default_executable = %q{kyototycoon-console}
14
12
  s.description = %q{KyotoTycoon client for Ruby}
15
13
  s.email = %q{k@uu59.org}
16
- s.executables = ["kyototycoon-console"]
17
14
  s.extra_rdoc_files = [
18
15
  "README.markdown"
19
16
  ]
20
- s.files = [
21
- "Changes.md",
22
- "Gemfile",
23
- "Gemfile.lock",
24
- "MIT-LICENSE",
25
- "README.markdown",
26
- "Rakefile",
27
- "VERSION",
28
- "benchmark/bulk.rb",
29
- "benchmark/bulk_bigdata.rb",
30
- "benchmark/getset.rb",
31
- "benchmark/getset_while_1sec.rb",
32
- "benchmark/helper.rb",
33
- "bin/kyototycoon-console",
34
- "kyototycoon.gemspec",
35
- "lib/kyototycoon.rb",
36
- "lib/kyototycoon/serializer.rb",
37
- "lib/kyototycoon/serializer/default.rb",
38
- "lib/kyototycoon/serializer/msgpack.rb",
39
- "lib/kyototycoon/stream.rb",
40
- "lib/kyototycoon/tsvrpc.rb",
41
- "lib/kyototycoon/tsvrpc/skinny.rb",
42
- "spec/helper.rb",
43
- "spec/ktslave.txt"
44
- ]
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
45
20
  s.homepage = %q{http://github.com/uu59/kyototycoon-ruby}
46
21
  s.licenses = ["MIT"]
47
22
  s.require_paths = ["lib"]
48
23
  s.rubygems_version = %q{1.6.2}
49
24
  s.summary = %q{KyotoTycoon client for Ruby}
50
- s.test_files = [
51
- "spec/helper.rb"
52
- ]
25
+
26
+ s.add_dependency(%q<msgpack>, [">= 0"])
53
27
 
54
28
  if s.respond_to? :specification_version then
55
29
  s.specification_version = 3
56
-
30
+
57
31
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
58
32
  s.add_development_dependency(%q<rspec>, ["~> 2.1.0"])
59
33
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
60
34
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
61
- s.add_development_dependency(%q<rcov>, [">= 0"])
62
- s.add_development_dependency(%q<msgpack>, [">= 0"])
35
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
63
36
  else
64
37
  s.add_dependency(%q<rspec>, ["~> 2.1.0"])
65
38
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
66
39
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
67
- s.add_dependency(%q<rcov>, [">= 0"])
68
- s.add_dependency(%q<msgpack>, [">= 0"])
40
+ s.add_dependency(%q<simplecov>, [">= 0"])
69
41
  end
70
42
  else
71
43
  s.add_dependency(%q<rspec>, ["~> 2.1.0"])
72
44
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
73
45
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
74
- s.add_dependency(%q<rcov>, [">= 0"])
75
- s.add_dependency(%q<msgpack>, [">= 0"])
46
+ s.add_dependency(%q<simplecov>, [">= 0"])
76
47
  end
77
48
  end
78
49
 
data/lib/kyototycoon.rb CHANGED
@@ -4,7 +4,7 @@ require "logger"
4
4
  require "cgi"
5
5
  require "socket"
6
6
  require "base64"
7
- require "net/http"
7
+ require "timeout"
8
8
  require "kyototycoon/serializer.rb"
9
9
  require "kyototycoon/serializer/default.rb"
10
10
  require "kyototycoon/serializer/msgpack.rb"
@@ -13,7 +13,7 @@ require "kyototycoon/tsvrpc/skinny.rb"
13
13
  require "kyototycoon/stream.rb"
14
14
 
15
15
  class KyotoTycoon
16
- VERSION = '0.5.3'
16
+ VERSION = '0.5.5'
17
17
 
18
18
  attr_accessor :colenc, :connect_timeout, :servers
19
19
  attr_reader :serializer, :logger, :db
@@ -32,6 +32,14 @@ class KyotoTycoon
32
32
  kt
33
33
  }
34
34
  end
35
+
36
+ def self.configures
37
+ @configure
38
+ end
39
+
40
+ def self.configure_reset!
41
+ @configure = {}
42
+ end
35
43
 
36
44
  def self.create(name)
37
45
  if @configure[name].nil?
@@ -126,7 +134,7 @@ class KyotoTycoon
126
134
  # records={'a' => 'aa', 'b' => 'bb'}
127
135
  values = {}
128
136
  records.each{|k,v|
129
- values["_#{k}"] = @serializer.encode(v)
137
+ values[k.to_s.match(/^_/) ? k.to_s : "_#{k}"] = @serializer.encode(v)
130
138
  }
131
139
  res = request('/rpc/set_bulk', values)
132
140
  Tsvrpc.parse(res[:body], res[:colenc])
@@ -139,9 +147,13 @@ class KyotoTycoon
139
147
  }
140
148
  res = request('/rpc/get_bulk', params)
141
149
  ret = {}
142
- Tsvrpc.parse(res[:body], res[:colenc]).each{|k,v|
143
- ret[k] = k.match(/^_/) ? @serializer.decode(v) : v
144
- }
150
+ bulk = Tsvrpc.parse(res[:body], res[:colenc])
151
+ bulk.keep_if {|k,v| k.match(/^_/)}
152
+ ret = bulk.reduce({}) do |hash, (k,v)|
153
+ key = k.match(/^_/) ? k[1..-1] : k
154
+ hash[key] = @serializer.decode(v)
155
+ hash
156
+ end
145
157
  ret
146
158
  end
147
159
 
@@ -263,6 +275,7 @@ class KyotoTycoon
263
275
  @logger.warn("connect failed at #{host}:#{port}")
264
276
  false
265
277
  ensure
278
+ # for 1.8.7
266
279
  rpc.finish
267
280
  end
268
281
  end
@@ -0,0 +1,72 @@
1
+ # -- coding: utf-8
2
+
3
+
4
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
5
+
6
+ describe KyotoTycoon do
7
+ it 'should handle multi servers' do
8
+ kt = KyotoTycoon.new('www.example.com', 11111)
9
+ kt.connect_timeout = 0.1
10
+ kt.servers << ['example.net', 1978]
11
+ kt.servers << ['0.0.0.0', 19999]
12
+ kt['foo'] = 'bar'
13
+ kt[:foo].should == 'bar'
14
+ end
15
+
16
+ it 'should configure/create method works' do
17
+ logger = Logger.new(STDOUT)
18
+ KyotoTycoon.configure(:test) do |kt|
19
+ kt.logger = logger
20
+ kt.serializer = :msgpack
21
+ kt.db = 'foobar'
22
+ end
23
+ KyotoTycoon.configure(:test2, 'host', 1999) do |kt|
24
+ kt.logger = logger
25
+ kt.serializer = :msgpack
26
+ kt.db = 'foobar'
27
+ end
28
+ %w!test test2!.each{|name|
29
+ kt = KyotoTycoon.create(name.to_sym)
30
+ kt.logger.should == logger
31
+ kt.serializer.should == KyotoTycoon::Serializer::Msgpack
32
+ kt.db.should == 'foobar'
33
+ }
34
+ lambda { KyotoTycoon.configure(:test2) }.should raise_error(StandardError)
35
+ lambda { KyotoTycoon.create(:not_exists) }.should raise_error(StandardError)
36
+
37
+ KyotoTycoon.configures.length.should == 2
38
+ KyotoTycoon.configure_reset!
39
+ KyotoTycoon.configures.length.should == 0
40
+ end
41
+
42
+ it 'should handle `ktremotemgr slave`' do
43
+ io = File.open("#{File.dirname(__FILE__)}/ktslave.txt", "r")
44
+ current = 0
45
+ KyotoTycoon::Stream.run(io){|line|
46
+ case current
47
+ when 0 # clear command
48
+ line.cmd.should == 'clear'
49
+ line.xt_time.should == Time.at(0)
50
+ line.value.should be_nil
51
+ line.key.should be_nil
52
+ line.value.should be_nil
53
+ when 1 # set foo bar
54
+ line.cmd.should == 'set'
55
+ line.xt_time.should > Time.now
56
+ line.key.should == 'foo'
57
+ line.value.should == 'bar'
58
+ when 2 # set fooxt bar with xt(2010-12-23 22:09:49 +0900)
59
+ line.cmd.should == 'set'
60
+ line.key.should == 'fooxt'
61
+ line.value.should == 'bar'
62
+ line.xt_time.should > Time.at(1234567890)
63
+ line.xt_time.should < Time.at(1334567890)
64
+ when 3 # remove foo
65
+ line.cmd.should == 'remove'
66
+ line.key.should == 'foo'
67
+ line.value.should be_nil
68
+ end
69
+ current += 1
70
+ }
71
+ end
72
+ end
@@ -0,0 +1,132 @@
1
+ # -- coding: utf-8
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper.rb')
4
+
5
+ describe KyotoTycoon do
6
+ [:U, :B].each{|colenc|
7
+ context "colenc=#{colenc}" do
8
+ before(:each) do
9
+ @kt.colenc = colenc
10
+ end
11
+
12
+ [:default, :msgpack].each{|serializer|
13
+ context "serializer=#{serializer}" do
14
+ before(:each) do
15
+ @kt.serializer = serializer
16
+ end
17
+
18
+ it 'should provide simple kvs feature' do
19
+ @kt.set('a', 'b')
20
+ @kt.get('a').should == 'b'
21
+ @kt['foo'] = 'bar'
22
+ @kt['foo'].should == 'bar'
23
+ @kt.delete('foo')
24
+ @kt['foo'].should be_nil
25
+
26
+ @kt.add('123', '123')
27
+ @kt['123'].should == '123'
28
+ @kt.replace('123', '456')
29
+ @kt['123'].should == '456'
30
+ @kt.clear
31
+ @kt.report['db_total_count'].to_i.should == 0
32
+ @kt.status['count'].to_i.should == 0
33
+
34
+ @kt['foo'] = 'oldbaz'
35
+ @kt.cas('foo', 'oldbaz', 'newbaz').should be_true
36
+ @kt.cas('foo', 'oldbaz', 'newbaz').should be_false
37
+ @kt.get('foo').should == 'newbaz'
38
+ @kt.clear
39
+
40
+ @kt['foo'] ||= 'aaa'
41
+ @kt['foo'] ||= 'bbb'
42
+ @kt['foo'].should == 'aaa'
43
+ @kt.clear
44
+
45
+ @kt[:a] = 1
46
+ @kt[:b] = 1
47
+ @kt.keys.sort.should == %w!a b!.sort
48
+ @kt.clear
49
+
50
+ @kt[:longvalue] = "-" * 2048
51
+ @kt[:longvalue].should == '-' * 2048
52
+ end
53
+
54
+ it 'should provide bulk' do
55
+ data = {}
56
+ 10.times{|n|
57
+ data[n.to_s] = n.to_s
58
+ }
59
+ @kt.set_bulk(data)
60
+ @kt.get_bulk(data.keys).sort.should == data.sort
61
+ @kt.remove_bulk(data.keys)
62
+ @kt.get_bulk(data.keys).should == {}
63
+ end
64
+
65
+ it 'should can handle strange key/value' do
66
+ # '+' is known ambiguity key on URL encode/decode processing
67
+ %w!a\tb a\nb a\r\nb a*-b a^@b!.each{|outlaw|
68
+ @kt[outlaw] = outlaw
69
+ @kt[outlaw].should == outlaw
70
+ }
71
+ end
72
+
73
+ it 'should provide delete variation' do
74
+ build = lambda {|kt|
75
+ kt.clear
76
+ kt.set_bulk({
77
+ :a => 1,
78
+ :b => 1,
79
+ :c => 1,
80
+ })
81
+ }
82
+ build.call(@kt)
83
+ @kt.delete('a','b')
84
+ @kt.keys.should == ['c']
85
+
86
+ build.call(@kt)
87
+ @kt.delete(['a', 'b'])
88
+ @kt.keys.should == ['c']
89
+ end
90
+
91
+ it 'should increment' do
92
+ @kt.increment('foo').should == 1
93
+ @kt.increment('foo').should == 2
94
+ @kt.increment('foo').should == 3
95
+ @kt.increment('foo', 10).should == 13
96
+ @kt.increment('foo', -10).should == 3
97
+ @kt.decrement('foo', 5).should == -2
98
+ @kt.incr('foo', 5).should == 3
99
+ @kt.decr('foo', 5).should == -2
100
+ end
101
+
102
+ it 'should provide status/report' do
103
+ @kt[:a] = 1
104
+ @kt[:b] = 2
105
+ @kt.report['db_total_count'].to_i.should == 2
106
+ @kt.status['count'].to_i.should == 2
107
+ end
108
+
109
+ it 'should match prefixes' do
110
+ @kt['123'] = 1
111
+ @kt['124'] = 1
112
+ @kt['125'] = 1
113
+ @kt['999'] = 1
114
+ @kt['9999'] = 1
115
+ @kt.match_prefix("12").sort.should == %w!123 124 125!.sort
116
+ @kt.match_prefix("9").sort.should == %w!999 9999!.sort
117
+ @kt.match_prefix("9999").sort.should == %w!9999!
118
+ @kt.match_regex(/^12/).sort.should == %w!123 124 125!.sort
119
+ @kt.match_regex(/^9+$/).sort.should == %w!999 9999!.sort
120
+ end
121
+
122
+ if serializer == :msgpack
123
+ it 'should keep variable type(int) with msgpack' do
124
+ @kt["foo"] = 42
125
+ @kt["foo"].should == 42
126
+ end
127
+ end
128
+ end
129
+ }
130
+ end
131
+ }
132
+ end
@@ -0,0 +1,37 @@
1
+ # -- coding: utf-8
2
+
3
+ =begin
4
+
5
+ !!!!!!!!!!!!!
6
+ !! CAUTION !!
7
+ !!!!!!!!!!!!!
8
+
9
+ This script access http://0.0.0.0:19999/ and destroy all records.
10
+ Be carefully for run, and run `ktserver -port 19999 '*'` before testing.
11
+
12
+ =end
13
+
14
+ unless ENV["COV"].nil?
15
+ require "simplecov"
16
+ SimpleCov.start
17
+ end
18
+
19
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + "/../lib")
20
+ require "rubygems"
21
+ require "kyototycoon.rb"
22
+ require "kyototycoon/stream.rb"
23
+
24
+ RSpec.configure do |conf|
25
+ conf.before(:all) do
26
+ @kt = KyotoTycoon.new('0.0.0.0', 19999)
27
+ @kt.serializer=:default # or :msgpack
28
+ @kt.logger=nil
29
+ end
30
+
31
+ conf.before(:each) do
32
+ end
33
+
34
+ conf.after(:each) do
35
+ @kt.clear
36
+ end
37
+ end
metadata CHANGED
@@ -1,82 +1,81 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: kyototycoon
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.5
4
5
  prerelease:
5
- version: 0.5.4
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - uu59
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-06-29 00:00:00 +10:00
12
+ date: 2011-07-30 00:00:00.000000000 +10:00
14
13
  default_executable: kyototycoon-console
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: rspec
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: msgpack
17
+ requirement: &2153386360 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
18
24
  prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
25
+ version_requirements: *2153386360
26
+ - !ruby/object:Gem::Dependency
27
+ name: rspec
28
+ requirement: &2153384620 !ruby/object:Gem::Requirement
20
29
  none: false
21
- requirements:
30
+ requirements:
22
31
  - - ~>
23
- - !ruby/object:Gem::Version
32
+ - !ruby/object:Gem::Version
24
33
  version: 2.1.0
25
34
  type: :development
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
35
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
36
+ version_requirements: *2153384620
37
+ - !ruby/object:Gem::Dependency
38
+ name: bundler
39
+ requirement: &2153384020 !ruby/object:Gem::Requirement
31
40
  none: false
32
- requirements:
41
+ requirements:
33
42
  - - ~>
34
- - !ruby/object:Gem::Version
43
+ - !ruby/object:Gem::Version
35
44
  version: 1.0.0
36
45
  type: :development
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: jeweler
40
46
  prerelease: false
41
- requirement: &id003 !ruby/object:Gem::Requirement
47
+ version_requirements: *2153384020
48
+ - !ruby/object:Gem::Dependency
49
+ name: jeweler
50
+ requirement: &2153383420 !ruby/object:Gem::Requirement
42
51
  none: false
43
- requirements:
52
+ requirements:
44
53
  - - ~>
45
- - !ruby/object:Gem::Version
54
+ - !ruby/object:Gem::Version
46
55
  version: 1.5.1
47
56
  type: :development
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
50
- name: rcov
51
57
  prerelease: false
52
- requirement: &id004 !ruby/object:Gem::Requirement
58
+ version_requirements: *2153383420
59
+ - !ruby/object:Gem::Dependency
60
+ name: simplecov
61
+ requirement: &2153382800 !ruby/object:Gem::Requirement
53
62
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- version: "0"
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
58
67
  type: :development
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
61
- name: msgpack
62
68
  prerelease: false
63
- requirement: &id005 !ruby/object:Gem::Requirement
64
- none: false
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: "0"
69
- type: :development
70
- version_requirements: *id005
69
+ version_requirements: *2153382800
71
70
  description: KyotoTycoon client for Ruby
72
71
  email: k@uu59.org
73
- executables:
72
+ executables:
74
73
  - kyototycoon-console
75
74
  extensions: []
76
-
77
- extra_rdoc_files:
75
+ extra_rdoc_files:
78
76
  - README.markdown
79
- files:
77
+ files:
78
+ - .gitignore
80
79
  - Changes.md
81
80
  - Gemfile
82
81
  - Gemfile.lock
@@ -98,35 +97,38 @@ files:
98
97
  - lib/kyototycoon/stream.rb
99
98
  - lib/kyototycoon/tsvrpc.rb
100
99
  - lib/kyototycoon/tsvrpc/skinny.rb
101
- - spec/helper.rb
100
+ - spec/connect_spec.rb
102
101
  - spec/ktslave.txt
102
+ - spec/options_spec.rb
103
+ - spec/spec_helper.rb
103
104
  has_rdoc: true
104
105
  homepage: http://github.com/uu59/kyototycoon-ruby
105
- licenses:
106
+ licenses:
106
107
  - MIT
107
108
  post_install_message:
108
109
  rdoc_options: []
109
-
110
- require_paths:
110
+ require_paths:
111
111
  - lib
112
- required_ruby_version: !ruby/object:Gem::Requirement
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
113
  none: false
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: "0"
118
- required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
119
  none: false
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- version: "0"
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
124
  requirements: []
125
-
126
125
  rubyforge_project:
127
126
  rubygems_version: 1.6.2
128
127
  signing_key:
129
128
  specification_version: 3
130
129
  summary: KyotoTycoon client for Ruby
131
- test_files:
132
- - spec/helper.rb
130
+ test_files:
131
+ - spec/connect_spec.rb
132
+ - spec/ktslave.txt
133
+ - spec/options_spec.rb
134
+ - spec/spec_helper.rb
data/spec/helper.rb DELETED
@@ -1,194 +0,0 @@
1
- # -- coding: utf-8
2
-
3
- =begin
4
-
5
- !!!!!!!!!!!!!
6
- !! CAUTION !!
7
- !!!!!!!!!!!!!
8
-
9
- This script access http://0.0.0.0:19999/ and destroy all records.
10
- Be carefully for run, and run `ktserver -port 19999 '*'` before testing.
11
-
12
- =end
13
-
14
- $LOAD_PATH.unshift(File.dirname(__FILE__) + "/../lib")
15
- require "rubygems"
16
- require "kyototycoon.rb"
17
- require "kyototycoon/stream.rb"
18
-
19
- describe do
20
- before(:all) do
21
- @kt = KyotoTycoon.new('0.0.0.0', 19999)
22
- @kt.serializer=:default # or :msgpack
23
- @kt.logger=nil
24
- end
25
-
26
- before(:each) do
27
- end
28
-
29
- after(:each) do
30
- @kt.clear
31
- end
32
-
33
- it 'should handle multi servers' do
34
- kt = KyotoTycoon.new('www.example.com', 11111)
35
- kt.connect_timeout = 0.1
36
- kt.servers << ['example.net', 1978]
37
- kt.servers << ['0.0.0.0', 19999]
38
- kt['foo'] = 'bar'
39
- kt[:foo].should == 'bar'
40
- end
41
-
42
- it 'should provide simple kvs feature' do
43
- @kt.set('a', 'b')
44
- @kt.get('a').should == 'b'
45
- @kt['foo'] = 'bar'
46
- @kt['foo'].should == 'bar'
47
- @kt.delete('foo')
48
- @kt['foo'].should be_nil
49
- @kt.clear
50
- @kt.report['db_total_count'].to_i.should == 0
51
- @kt.status['count'].to_i.should == 0
52
-
53
- @kt['foo'] = 'oldbaz'
54
- @kt.cas('foo', 'oldbaz', 'newbaz').should be_true
55
- @kt.cas('foo', 'oldbaz', 'newbaz').should be_false
56
- @kt.get('foo').should == 'newbaz'
57
- @kt.clear
58
-
59
- @kt['foo'] ||= 'aaa'
60
- @kt['foo'] ||= 'bbb'
61
- @kt['foo'].should == 'aaa'
62
- @kt.clear
63
-
64
- @kt[:a] = 1
65
- @kt[:b] = 1
66
- @kt.keys.sort.should == %w!a b!.sort
67
- @kt.clear
68
-
69
- @kt[:longvalue] = "-" * 2048
70
- @kt[:longvalue].should == '-' * 2048
71
- end
72
-
73
- it 'should provide bulk' do
74
- data = {}
75
- receive = {}
76
- 10.times{|n|
77
- data[n.to_s] = n.to_s
78
- receive["_#{n}"] = n.to_s
79
- }
80
- receive['num'] = "10"
81
- @kt.set_bulk(data)
82
- @kt.get_bulk(data.keys).sort.should == receive.sort
83
- @kt.remove_bulk(data.keys)
84
- @kt.get_bulk(data.keys).should == {'num' => '0'}
85
- end
86
-
87
- it 'should can handle strange key/value' do
88
- # '+' is known ambiguity key on URL encode/decode processing
89
- %w!a\tb a\nb a\r\nb a*-b a^@b!.each{|outlaw|
90
- @kt[outlaw] = outlaw
91
- @kt[outlaw].should == outlaw
92
- }
93
- end
94
-
95
- it 'should provide delete variation' do
96
- build = lambda {|kt|
97
- kt.clear
98
- kt.set_bulk({
99
- :a => 1,
100
- :b => 1,
101
- :c => 1,
102
- })
103
- }
104
- build.call(@kt)
105
- @kt.delete('a','b')
106
- @kt.keys.should == ['c']
107
-
108
- build.call(@kt)
109
- @kt.delete(['a', 'b'])
110
- @kt.keys.should == ['c']
111
- end
112
-
113
- it 'should increment' do
114
- @kt.increment('foo').should == 1
115
- @kt.increment('foo').should == 2
116
- @kt.increment('foo').should == 3
117
- @kt.increment('foo', 10).should == 13
118
- @kt.increment('foo', -10).should == 3
119
- @kt.decrement('foo', 5).should == -2
120
- @kt.incr('foo', 5).should == 3
121
- @kt.decr('foo', 5).should == -2
122
- end
123
-
124
- it 'should provide status/report' do
125
- @kt[:a] = 1
126
- @kt[:b] = 2
127
- @kt.report['db_total_count'].to_i.should == 2
128
- @kt.status['count'].to_i.should == 2
129
- end
130
-
131
- it 'should match prefixes' do
132
- @kt['123'] = 1
133
- @kt['124'] = 1
134
- @kt['125'] = 1
135
- @kt['999'] = 1
136
- @kt['9999'] = 1
137
- @kt.match_prefix("12").sort.should == %w!123 124 125!.sort
138
- @kt.match_prefix("9").sort.should == %w!999 9999!.sort
139
- @kt.match_prefix("9999").sort.should == %w!9999!
140
- @kt.match_regex(/^12/).sort.should == %w!123 124 125!.sort
141
- @kt.match_regex(/^9+$/).sort.should == %w!999 9999!.sort
142
- end
143
-
144
- it 'should configure/create method works' do
145
- logger = Logger.new(STDOUT)
146
- KyotoTycoon.configure(:test) do |kt|
147
- kt.logger = logger
148
- kt.serializer = :msgpack
149
- kt.db = 'foobar'
150
- end
151
- KyotoTycoon.configure(:test2, 'host', 1999) do |kt|
152
- kt.logger = logger
153
- kt.serializer = :msgpack
154
- kt.db = 'foobar'
155
- end
156
- %w!test test2!.each{|name|
157
- kt = KyotoTycoon.create(name.to_sym)
158
- kt.logger.should == logger
159
- kt.serializer.should == KyotoTycoon::Serializer::Msgpack
160
- kt.db.should == 'foobar'
161
- }
162
- end
163
-
164
- it 'should handle `ktremotemgr slave`' do
165
- io = File.open("#{File.dirname(__FILE__)}/ktslave.txt", "r")
166
- current = 0
167
- KyotoTycoon::Stream.run(io){|line|
168
- case current
169
- when 0 # clear command
170
- line.cmd.should == 'clear'
171
- line.xt_time.should == Time.at(0)
172
- line.value.should be_nil
173
- line.key.should be_nil
174
- line.value.should be_nil
175
- when 1 # set foo bar
176
- line.cmd.should == 'set'
177
- line.xt_time.should > Time.now
178
- line.key.should == 'foo'
179
- line.value.should == 'bar'
180
- when 2 # set fooxt bar with xt(2010-12-23 22:09:49 +0900)
181
- line.cmd.should == 'set'
182
- line.key.should == 'fooxt'
183
- line.value.should == 'bar'
184
- line.xt_time.should > Time.at(1234567890)
185
- line.xt_time.should < Time.at(1334567890)
186
- when 3 # remove foo
187
- line.cmd.should == 'remove'
188
- line.key.should == 'foo'
189
- line.value.should be_nil
190
- end
191
- current += 1
192
- }
193
- end
194
- end