oria 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
+ coverage/*
1
2
  pkg/*
data/README.markdown CHANGED
@@ -144,46 +144,34 @@ Which means: **please report any problems you have using the [Github issue trac
144
144
  Benchmarks
145
145
  -
146
146
 
147
- I've run some benchmarks comparing Oria to Redis. It's not pretty:
147
+ Want to find out how well Oria will perform compared to existing solutions? Here are a few benchmarks.
148
148
 
149
- user system total real
150
- Redis (write): 0.050000 0.020000 0.070000 ( 0.115850)
151
- Oria (write): 0.140000 0.110000 0.250000 ( 1.267912)
152
- Redis (read): 0.070000 0.020000 0.090000 ( 0.145078)
153
- Oria (read): 0.150000 0.110000 0.260000 ( 1.247791)
154
-
155
- As you can see, Oria is about 10x slower than Redis on my development computer. Even worse, if you run the benchmark like so:
156
-
157
- ruby redis_v_oria.rb 10000
158
-
159
- Oria's server will fail to fulfill all of those requests. Scary. Clearly, it needs some serious improvement. Oria will never be
160
- as performant as something like Redis - it's not meant to be (plus it's written in Ruby, not C). But it could use some reduction
161
- in overhead, and any help is welcome.
162
-
163
- But I knew Oria wouldn't compete with Redis. What about MySQL?
149
+ Here's Redis and Oria:
164
150
 
165
151
  user system total real
166
- MySQL (write): 0.270000 0.030000 0.300000 ( 0.445586)
167
- Oria (write): 0.170000 0.120000 0.290000 ( 1.676674)
168
- MySQL (read): 0.310000 0.020000 0.330000 ( 0.484944)
169
- Oria (read): 0.120000 0.120000 0.240000 ( 1.616851)
152
+ Redis (write): 0.040000 0.020000 0.060000 ( 0.112147)
153
+ Oria (write): 0.130000 0.100000 0.230000 ( 0.394356)
154
+ Redis (read): 0.070000 0.020000 0.090000 ( 0.140881)
155
+ Oria (read): 0.130000 0.100000 0.230000 ( 0.394533)
156
+
157
+ Obviously, Redis is going to smack Oria down no matter what. Still, it's in a competitive range.
170
158
 
171
- Ew. Oria is consistently about 4x slower than MySQL. But check this out: I removed persistence, and here are the new benchmarks:
159
+ Here's MySQL and Oria:
172
160
 
173
161
  user system total real
174
- Redis (write): 0.040000 0.020000 0.060000 ( 0.113882)
175
- Oria (write): 0.130000 0.100000 0.230000 ( 0.396776)
176
- Redis (read): 0.070000 0.020000 0.090000 ( 0.145068)
177
- Oria (read): 0.130000 0.100000 0.230000 ( 0.395410)
162
+ MySQL (write): 0.260000 0.030000 0.290000 ( 0.423971)
163
+ Oria (write): 0.140000 0.100000 0.240000 ( 0.406949)
164
+ MySQL (read): 0.310000 0.020000 0.330000 ( 0.468195)
165
+ Oria (read): 0.100000 0.100000 0.200000 ( 0.330884)
178
166
 
179
- That's getting competitive. How about MySQL?
167
+ Oh snap! Oria outperforms MySQL. How about SQLite3, in memory?
180
168
 
181
- user system total real
182
- MySQL (write): 0.270000 0.030000 0.300000 ( 0.453413)
183
- Oria (write): 0.150000 0.110000 0.260000 ( 0.430725)
184
- MySQL (read): 0.320000 0.030000 0.350000 ( 0.484978)
185
- Oria (read): 0.100000 0.100000 0.200000 ( 0.373431)
169
+ user system total real
170
+ SQLite3 (write): 0.360000 0.010000 0.370000 ( 0.376660)
171
+ Oria (write): 0.100000 0.100000 0.200000 ( 0.368118)
172
+ SQLite3 (read): 0.370000 0.010000 0.380000 ( 0.379038)
173
+ Oria (read): 0.150000 0.100000 0.250000 ( 0.406342)
186
174
 
187
- Oh snap! Oria outperforms MySQL when persistence is disabled. So I'll have to refactor the code.
175
+ Looks like Oria will write faster but read slower than SQLite3 in-memory.
188
176
 
189
177
  Copyright (c) 2009 Flip Sasser, released under the MIT license
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'rake'
2
2
 
3
+ task :default => :spec
4
+
3
5
  begin
4
6
  require 'spec/rake/spectask'
5
7
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.1.0
@@ -0,0 +1,34 @@
1
+ require 'rubygems'
2
+ require 'eventmachine'
3
+ require 'eventmachine/client'
4
+ require 'benchmark'
5
+
6
+ class StopClient < EchoClient
7
+ def receive_data(data)
8
+ @response = data
9
+ EventMachine.stop_event_loop
10
+ end
11
+ end
12
+
13
+ client = nil
14
+ n = (ARGV.shift || 1000).to_i
15
+
16
+ Benchmark.bm(25) do |bm|
17
+ bm.report("EM (stop_event_loop):") do
18
+ n.times do
19
+ EventMachine.run do
20
+ client = EventMachine.connect "0.0.0.0", 8080, StopClient
21
+ client.send_data('PUT foo bar')
22
+ end
23
+ end
24
+ end
25
+
26
+ bm.report("EM (close_connection):") do
27
+ n.times do
28
+ EventMachine.run do
29
+ client = EventMachine.connect "0.0.0.0", 8080, EchoClient
30
+ client.send_data('PUT foo bar')
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'eventmachine'
3
+
4
+ class EchoClient < EventMachine::Connection
5
+ attr_reader :response
6
+
7
+ def receive_data(data)
8
+ @response = data
9
+ close_connection
10
+ end
11
+
12
+ def unbind
13
+ EventMachine.stop_event_loop
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'eventmachine'
3
+
4
+ module EchoServer
5
+ def receive_data(data)
6
+ send_data(data)
7
+ end
8
+ end
9
+
10
+ EventMachine.run do
11
+ EventMachine.start_server "0.0.0.0", 8080, EchoServer
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'eventmachine'
3
+
4
+ module EchoServer
5
+ def receive_data(data)
6
+ send_data(data)
7
+ end
8
+ end
9
+
10
+ EventMachine.run do
11
+ EventMachine.open_datagram_socket "0.0.0.0", 8080, EchoServer
12
+ end
@@ -0,0 +1,33 @@
1
+ require 'rubygems'
2
+ require 'redis'
3
+ require 'benchmark'
4
+
5
+ redis = Redis.new
6
+ hash = Hash.new
7
+ n = (ARGV.shift || 1000).to_i
8
+
9
+ Benchmark.bm(15) do |bm|
10
+ bm.report("Redis (write):") do
11
+ n.times do
12
+ redis['foo'] = 'bar'
13
+ end
14
+ end
15
+
16
+ bm.report("Hash (write):") do
17
+ n.times do
18
+ hash['foo'] = 'bar'
19
+ end
20
+ end
21
+
22
+ bm.report("Redis (read):") do
23
+ n.times do
24
+ foo = redis['foo']
25
+ end
26
+ end
27
+
28
+ bm.report("Hash (read):") do
29
+ n.times do
30
+ foo = hash['foo']
31
+ end
32
+ end
33
+ end
File without changes
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ require 'redis'
3
+ require 'eventmachine'
4
+ require 'eventmachine/client'
5
+ require 'benchmark'
6
+
7
+ redis = Redis.new
8
+ client = nil
9
+ n = (ARGV.shift || 1000).to_i
10
+
11
+ Benchmark.bm(15) do |bm|
12
+ bm.report("Redis (write):") do
13
+ n.times do
14
+ redis['foo'] = 'bar'
15
+ end
16
+ end
17
+
18
+ bm.report("Echo (write):") do
19
+ n.times do
20
+ EventMachine.run do
21
+ client = EventMachine.connect "0.0.0.0", 8080, EchoClient
22
+ client.send_data('PUT foo bar')
23
+ end
24
+ end
25
+ end
26
+
27
+ bm.report("Redis (read):") do
28
+ n.times do
29
+ foo = redis['foo']
30
+ end
31
+ end
32
+
33
+ bm.report("Echo (read):") do
34
+ n.times do
35
+ EventMachine.run do
36
+ client = EventMachine.connect "0.0.0.0", 8080, EchoClient
37
+ client.send_data('GET foo')
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+ require 'redis'
3
+ require 'eventmachine'
4
+ require 'eventmachine/client'
5
+ require 'benchmark'
6
+
7
+ redis = Redis.new
8
+ client = nil
9
+ n = (ARGV.shift || 1000).to_i
10
+
11
+ Benchmark.bm(15) do |bm|
12
+ bm.report("Redis (write):") do
13
+ n.times do
14
+ redis['foo'] = 'bar'
15
+ end
16
+ end
17
+
18
+ bm.report("Echo (write):") do
19
+ n.times do
20
+ EventMachine.run do
21
+ # TODO: Figure out how EM handles connecting TO UDP servers
22
+ client = EventMachine.open_datagram_socket "0.0.0.0", 0, EchoClient
23
+ client.send_datagram('GET foo', "0.0.0.0", 8080)
24
+ end
25
+ end
26
+ end
27
+
28
+ bm.report("Redis (read):") do
29
+ n.times do
30
+ foo = redis['foo']
31
+ end
32
+ end
33
+
34
+ bm.report("Echo (read):") do
35
+ n.times do
36
+ EventMachine.run do
37
+ client = EventMachine.open_datagram_socket "0.0.0.0", 0, EchoClient
38
+ client.send_datagram('GET foo', "0.0.0.0", 8080)
39
+ end
40
+ end
41
+ end
42
+ end
data/bin/oria CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'optparse'
3
3
  require 'rubygems'
4
- require 'oria'
5
- # require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'oria'))
4
+ # require 'oria'
5
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'oria'))
6
6
 
7
7
  module OriaCommand
8
8
  def self.go
@@ -13,6 +13,7 @@ module OriaCommand
13
13
  stop
14
14
  when 'restart'
15
15
  stop
16
+ sleep 0.5
16
17
  start
17
18
  else
18
19
  puts parser
@@ -27,40 +28,48 @@ module OriaCommand
27
28
  @options[:port] = port
28
29
  end
29
30
  opts.on('-h', '--host [IP]', 'The hostname or IP Oria should listen on.') do |host|
30
- @options[:host] = port
31
+ @options[:host] = host
31
32
  end
32
- opts.on('-d', '--debug', 'Log output to /tmp/oria.log') do |debug|
33
- @options[:debug] = true
33
+ opts.on('-d', '--daemonize', 'Daemonize the Oria process') do |daemonize|
34
+ @options[:daemonize] = true
35
+ end
36
+ opts.on('-D', '--debug', 'Log output to /tmp/oria.log') do |debug|
37
+ @options[:debug] ||= true
34
38
  end
35
39
  end
36
40
  end
37
41
 
38
42
  def self.parse_options
39
- @options = {:host => '0.0.0.0', :port => 6851, :debug => false}
43
+ @options = {:host => '0.0.0.0', :port => Oria.port}
40
44
  parser.parse!
41
45
  end
42
46
 
43
47
  def self.start
44
48
  puts "Starting Oria..."
45
49
  parse_options
46
- pid = fork do
47
- begin
48
- Oria::Server.start(@options[:host], @options[:port], nil, @options[:debug])
49
- rescue RuntimeError
50
- puts "\nOria cannot attach to port #{@options[:port]}. Maybe it's already running?"
51
- exit
52
- end
50
+ start_server = lambda {
51
+ $0 = "oria #{@options[:host]}:#{@options[:port]}#{' -d' if @options[:daemonize]}"
52
+ Oria::Server.start(@options[:host], @options[:port], @options[:debug], :puts => !@options[:daemonize])
53
+ }
54
+ if @options[:daemonize]
55
+ pid = fork &start_server
56
+ Process.detach(pid)
57
+ else
58
+ start_server.call
59
+ end
60
+ sleep 0.1
61
+ if Oria::Server.running?
62
+ puts "Oria listening on #{@options[:host]}:#{@options[:port]}"
53
63
  end
54
- Process.detach(pid)
55
- sleep 0.5
56
- puts "Oria started successfull on proccess ##{pid}"
57
64
  end
58
65
 
59
66
  def self.stop
60
67
  puts "Stopping Oria..."
61
- puts "Stopped!" if Oria::Server.stop
62
- rescue Errno::ESRCH
63
- puts "Oria does not appear to be running"
68
+ if Oria::Server.stop
69
+ puts "Stopped!"
70
+ else
71
+ puts "Oria does not appear to be running."
72
+ end
64
73
  end
65
74
  end
66
75
 
data/lib/oria/client.rb CHANGED
@@ -8,7 +8,10 @@ module Oria
8
8
 
9
9
  def receive_data(data)
10
10
  @response = JSON.parse(data)
11
- close_connection
11
+ # close_connection
12
+ # Note: Benchmarks found that calling stop_event_loop is slightly quicker
13
+ # than close_connection, which navigates the connection closing.
14
+ EventMachine.stop_event_loop
12
15
  end
13
16
 
14
17
  def unbind
data/lib/oria/server.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'yaml'
2
2
  require 'tmpdir'
3
+
3
4
  module Oria
4
5
  class Server < EventMachine::Connection
5
6
  class << self
@@ -10,7 +11,11 @@ module Oria
10
11
  end
11
12
 
12
13
  def log(value, app_key = nil)
13
- logger.debug("#{"#{app_key}: " if app_key}#{value}") if debug?
14
+ if debug? || @@options[:puts]
15
+ value = "#{Time.now.strftime('%d %b %H:%M:%S')} - #{"#{app_key}: " if app_key}#{value}"
16
+ logger.debug(value) if debug?
17
+ puts value if @@options[:puts]
18
+ end
14
19
  end
15
20
 
16
21
  def logger
@@ -18,34 +23,49 @@ module Oria
18
23
  @@logger ||= Logger.new(log_file, 0, 100 * 1024 * 1024)
19
24
  end
20
25
 
21
- def start(server, port, app_key = nil, debug = false)
22
- at_exit do
23
- Oria::Server.stop
24
- end
25
- pid = Process.pid
26
- File.open(pid_file, 'w') do |file|
27
- file.puts pid
28
- end
29
- app_key ||= 'default'
26
+ def running?
27
+ pid && !!Process.getpgid(pid)
28
+ rescue Errno::ESRCH
29
+ false
30
+ end
31
+
32
+ def start(server, port, debug = false, options = {})
33
+ @@debug = !!debug
34
+ @@options = options
35
+ log "Server started"
30
36
  @@servers ||= if File.exists?(yaml_store)
37
+ log "DB loaded from disk"
31
38
  YAML.load_file(yaml_store)
32
39
  else
33
40
  {}
34
41
  end
35
- @@debug = !!debug
36
- @@servers[app_key] ||= {}
42
+ pid = Process.pid
37
43
  EventMachine.run do
38
44
  EventMachine.start_server server, port, Oria::Server
45
+ File.open(pid_file, 'w') do |file|
46
+ file.puts pid
47
+ end
48
+ log "The server is now ready to accept connections on port #{port}"
39
49
  end
40
50
  end
41
51
 
42
52
  def stop
53
+ response = false
43
54
  if File.exists?(pid_file)
44
- if pid
45
- Process.kill(9, pid)
55
+ begin
56
+ if pid
57
+ Process.kill(9, pid)
58
+ response = true
59
+ end
60
+ rescue Errno::ESRCH
61
+ # TODO: We perform error reporting elsewhere. Still,
62
+ # an actionless rescue doesn't seem like a great idea.
63
+ ensure
64
+ File.unlink(pid_file)
65
+ @@pid = nil
46
66
  end
47
- File.unlink(pid_file)
48
67
  end
68
+ response
49
69
  end
50
70
 
51
71
  def store_hash(app_key)
@@ -120,7 +140,7 @@ module Oria
120
140
 
121
141
  private
122
142
  def hash
123
- @hash ||= @@servers[@app_key || 'default'] ||= {}
143
+ @hash ||= @@servers[@app_key && !@app_key.empty? ? @app_key : 'default'] ||= {}
124
144
  end
125
145
 
126
146
  def random_key
data/lib/oria.rb CHANGED
@@ -3,6 +3,7 @@ require 'rubygems'
3
3
  require 'eventmachine'
4
4
  require 'json'
5
5
  require 'oria/errors'
6
+ require 'tmpdir'
6
7
 
7
8
  module Oria
8
9
  autoload(:Client, 'oria/client')
@@ -25,34 +26,25 @@ module Oria
25
26
  @@app_key = key.to_s
26
27
  end
27
28
 
28
- def self.auto_start
29
- @@pid = fork do
30
- Oria::Server.start(Oria.server, Oria.port, Oria.app_key)
31
- end
32
- Process.detach(@@pid)
33
- at_exit {
34
- Process.kill("HUP", @@pid)
35
- }
36
- sleep 1
37
- end
38
-
39
29
  def self.clear
40
30
  store(:delete)
41
31
  end
42
32
 
43
- def self.connect(server, port = nil, options = {})
44
- @@server = server
33
+ def self.connect(server = Oria.server, port = Oria.port, debug = false)
34
+ @@server = server.to_s
45
35
  @@port = port.to_i unless port.to_i == 0
36
+ unless Oria::Server.running?
37
+ # That's right. Boot Oria on the command line so we don't bother forking or any
38
+ # of that other troublesome nonsense. It's smart enough to maintain its own
39
+ # status and start/stop/restart itself.
40
+ system("./bin/oria start -d -h #{@@server} -p #{@@port}")
41
+ end
46
42
  end
47
43
 
48
44
  def self.delete(key)
49
45
  store(:delete, :key => key)
50
46
  end
51
47
 
52
- def self.disconnect
53
- Oria::Server.stop
54
- end
55
-
56
48
  def self.has_key?(key)
57
49
  key?(key)
58
50
  end
@@ -90,7 +82,13 @@ module Oria
90
82
  args = JSON.generate(args)
91
83
  do_store(method, args)
92
84
  rescue Oria::ConnectionError
93
- auto_start
85
+ # Thanks to ActiveSupport for the "silence_stream" functionality - we're quieting STDOUT
86
+ # at autoconnect time.
87
+ old_stream = STDOUT.dup
88
+ STDOUT.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
89
+ STDOUT.sync = true
90
+ connect
91
+ STDOUT.reopen(old_stream)
94
92
  do_store(method, args)
95
93
  end
96
94
  end
data/oria.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{oria}
8
- s.version = "0.0.3"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Flip Sasser"]
12
- s.date = %q{2009-11-23}
12
+ s.date = %q{2009-11-27}
13
13
  s.default_executable = %q{oria}
14
14
  s.description = %q{
15
15
  Oria (oh-rye-uh) is an in-memory, Ruby-based Key-Value store. It's designed to handle moderate amounts of data quickly
@@ -28,10 +28,17 @@ Gem::Specification.new do |s|
28
28
  "README.markdown",
29
29
  "Rakefile",
30
30
  "VERSION",
31
- "benchmarks/mysql_table.sql",
31
+ "benchmarks/em_stop_v_disconnect.rb",
32
+ "benchmarks/eventmachine/client.rb",
33
+ "benchmarks/eventmachine/tcp_server.rb",
34
+ "benchmarks/eventmachine/udp_server.rb",
35
+ "benchmarks/hash_v_redis.rb",
36
+ "benchmarks/mysql_v_oria.rb",
32
37
  "benchmarks/redis_v_oria.rb",
33
- "benchmarks/sequel_v_oria.rb",
34
38
  "benchmarks/sqlite_v_oria.rb",
39
+ "benchmarks/support/mysql_table.sql",
40
+ "benchmarks/tcp_v_redis.rb",
41
+ "benchmarks/udp_v_redis.rb",
35
42
  "bin/oria",
36
43
  "lib/oria.rb",
37
44
  "lib/oria/client.rb",
data/spec/oria_spec.rb CHANGED
@@ -28,128 +28,125 @@ describe Oria do
28
28
  end
29
29
  end
30
30
 
31
- it "should provide a connect method" do
32
- Oria.should respond_to(:connect)
33
- end
34
-
35
- it "should support per-app keys" do
36
- Oria.should respond_to(:app_key)
37
- Oria.should respond_to(:app_key=)
38
- end
31
+ describe "class methods" do
32
+ it "should provide a connect method" do
33
+ Oria.should respond_to(:connect)
34
+ end
39
35
 
40
- it "should support custom connections" do
41
- Oria.connect("127.0.0.1", 4567)
42
- Oria.server.should == "127.0.0.1"
43
- Oria.port.should == 4567
44
- end
36
+ it "should support per-app keys" do
37
+ Oria.should respond_to(:app_key)
38
+ Oria.should respond_to(:app_key=)
39
+ end
45
40
 
46
- it "should automatically boot a server" do
47
- # Oria.should_receive(:auto_start)
48
- # Oria["foo"] = "bar"
49
- # Oria.disconnect
41
+ it "should support custom connections" do
42
+ Oria.connect("127.0.0.1", 4567)
43
+ Oria.server.should == "127.0.0.1"
44
+ Oria.port.should == 4567
45
+ Oria::Server.stop
46
+ sleep 1
47
+ end
50
48
  end
51
49
 
52
50
  describe "app_key" do
53
51
  # it "should default to nil" do
54
52
  # # This is bleeding over from the last example below. Frankly,
55
- # # I don't know how to fix it.
53
+ # # I don't know how to fix it. I'm unclear on separating
54
+ # # Rspec examples from each other at the class level like
55
+ # # this.
56
56
  # Oria.app_key.should be_nil
57
57
  # end
58
-
58
+
59
59
  it "should be configurable" do
60
60
  Oria.app_key = "test_app"
61
61
  Oria.app_key.should == "test_app"
62
62
  end
63
63
  end
64
+
65
+ describe "setting values" do
66
+ before :all do
67
+ Oria.connect
68
+ sleep 1
69
+ end
64
70
 
65
- it "should be possible to disconnect" do
66
- Oria::Server.should_receive(:stop)
67
- Oria["foo"] = "bar"
68
- Oria.disconnect
69
- end
71
+ after :all do
72
+ # TODO: In general, I find "sleep" to be a terrible method of doing anything.
73
+ # Still, it gets the job done, albeit by delaying our specs.
74
+ Oria::Server.stop
75
+ sleep 0.5
76
+ end
77
+
78
+ it "should set string values" do
79
+ Oria["foo"] = "bar"
80
+ Oria["foo"].should == "bar"
81
+ end
70
82
 
71
- describe "setting values" do
72
- describe "with a booted server" do
73
- before :all do
74
- @pid = fork do
75
- Oria::Server.start(Oria.server, Oria.port, nil, true)
76
- end
77
- Process.detach(@pid)
78
- sleep 0.5
79
- end
80
-
81
- after :all do
82
- Oria.clear
83
- Oria::Server.stop
84
- Process.kill("HUP", @pid)
85
- end
86
-
87
- it "should set string values" do
88
- Oria["foo"] = "bar"
89
- Oria["foo"].should == "bar"
90
- end
91
-
92
- it "should set integer values" do
93
- Oria["foo"] = 12
94
- Oria["foo"].should == 12
95
- end
96
-
97
- it "should support Hashes" do
98
- Oria["foo"] = {"Flip" => "Sasser"}
99
- Oria["foo"].should == {"Flip" => "Sasser"}
100
- end
101
-
102
- it "should support Arrays" do
103
- Oria["foo"] = ["Foo", "Bar", "Baz"]
104
- Oria["foo"].should == ["Foo", "Bar", "Baz"]
105
- end
106
-
107
- it "should support Booleans" do
108
- Oria["true"] = false
109
- Oria["true"].should == false
110
- end
111
-
112
- it "should support deleting values" do
113
- Oria["memoria"] = "foobar"
114
- Oria["dont_delete"] = "please"
115
- Oria.delete("memoria").should == "foobar"
116
- Oria["memora"].should be_nil
117
- Oria["dont_delete"].should == "please"
118
- end
119
-
120
- it "should support complete clearing" do
121
- Oria["a"] = "c"
122
- Oria["b"] = "d"
123
- Oria["a"].should == "c"
124
- Oria["b"].should == "d"
125
- Oria.clear
126
- Oria["a"].should be_nil
127
- Oria["b"].should be_nil
128
- end
129
-
130
- it "should support key-checking" do
131
- Oria["key_check"] = "check-a-key"
132
- Oria.key?("key_check").should be_true
133
- Oria.key?("key_check_broken").should be_false
134
- Oria.has_key?("key_check").should be_true
135
- Oria.has_key?("key_check_broken").should be_false
136
- end
137
-
138
- it "should support stashing" do
139
- key = Oria.stash("foobar")
140
- key.should_not be_nil
141
- Oria[key].should == "foobar"
142
- end
143
-
144
- it "should support different app_keys" do
145
- Oria.app_key = "test_app_1"
146
- Oria["test_app_1"] = "bar"
147
- Oria["test_app_1"].should == "bar"
148
- Oria.app_key = "test_app_2"
149
- Oria["test_app_2"] = "baz"
150
- Oria["test_app_1"].should be_nil
151
- Oria["test_app_2"].should == "baz"
152
- end
83
+ it "should set integer values" do
84
+ Oria["foo"] = 12
85
+ Oria["foo"].should == 12
86
+ end
87
+
88
+ it "should support Hashes" do
89
+ Oria["foo"] = {"Flip" => "Sasser"}
90
+ Oria["foo"].should == {"Flip" => "Sasser"}
91
+ end
92
+
93
+ it "should support Arrays" do
94
+ Oria["foo"] = ["Foo", "Bar", "Baz"]
95
+ Oria["foo"].should == ["Foo", "Bar", "Baz"]
96
+ end
97
+
98
+ it "should support Booleans" do
99
+ Oria["true"] = false
100
+ Oria["true"].should == false
101
+ end
102
+
103
+ it "should support deleting values" do
104
+ Oria["memoria"] = "foobar"
105
+ Oria["dont_delete"] = "please"
106
+ Oria.delete("memoria").should == "foobar"
107
+ Oria["memora"].should be_nil
108
+ Oria["dont_delete"].should == "please"
109
+ end
110
+
111
+ it "should support complete clearing" do
112
+ Oria["a"] = "c"
113
+ Oria["b"] = "d"
114
+ Oria["a"].should == "c"
115
+ Oria["b"].should == "d"
116
+ Oria.clear
117
+ Oria["a"].should be_nil
118
+ Oria["b"].should be_nil
119
+ end
120
+
121
+ it "should support key-checking" do
122
+ Oria["key_check"] = "check-a-key"
123
+ Oria.key?("key_check").should be_true
124
+ Oria.key?("key_check_broken").should be_false
125
+ Oria.has_key?("key_check").should be_true
126
+ Oria.has_key?("key_check_broken").should be_false
127
+ end
128
+
129
+ it "should support stashing" do
130
+ key = Oria.stash("foobar")
131
+ key.should_not be_nil
132
+ Oria[key].should == "foobar"
133
+ end
134
+
135
+ it "should support different app_keys" do
136
+ Oria.app_key = "test_app_1"
137
+ Oria["test_app_1"] = "bar"
138
+ Oria["test_app_1"].should == "bar"
139
+ Oria.app_key = "test_app_2"
140
+ Oria["test_app_2"] = "baz"
141
+ Oria["test_app_1"].should be_nil
142
+ Oria["test_app_2"].should == "baz"
153
143
  end
154
144
  end
145
+
146
+ # it "should automatically boot a server" do
147
+ # Oria.should_receive(:connect)
148
+ # Oria["foo"] = "bar"
149
+ # Oria["foo"].should == "bar"
150
+ # Oria::Server.stop
151
+ # end
155
152
  end
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,7 @@
1
1
  $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
 
3
+ def start_server(debug = false)
4
+ fork do
5
+ Oria::Server.start(Oria.server, Oria.port, debug)
6
+ end
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oria
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Flip Sasser
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-23 00:00:00 -05:00
12
+ date: 2009-11-27 00:00:00 -05:00
13
13
  default_executable: oria
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -47,10 +47,17 @@ files:
47
47
  - README.markdown
48
48
  - Rakefile
49
49
  - VERSION
50
- - benchmarks/mysql_table.sql
50
+ - benchmarks/em_stop_v_disconnect.rb
51
+ - benchmarks/eventmachine/client.rb
52
+ - benchmarks/eventmachine/tcp_server.rb
53
+ - benchmarks/eventmachine/udp_server.rb
54
+ - benchmarks/hash_v_redis.rb
55
+ - benchmarks/mysql_v_oria.rb
51
56
  - benchmarks/redis_v_oria.rb
52
- - benchmarks/sequel_v_oria.rb
53
57
  - benchmarks/sqlite_v_oria.rb
58
+ - benchmarks/support/mysql_table.sql
59
+ - benchmarks/tcp_v_redis.rb
60
+ - benchmarks/udp_v_redis.rb
54
61
  - bin/oria
55
62
  - lib/oria.rb
56
63
  - lib/oria/client.rb