redis-rpc 1.0.0
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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/CHANGELOG.markdown +79 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +34 -0
- data/LICENSE +674 -0
- data/README.markdown +161 -0
- data/Rakefile +7 -0
- data/VERSION +1 -0
- data/docs/github-flavored-markdown.rb +65 -0
- data/docs/redisrpc_example.ai +1075 -1
- data/docs/redisrpc_example.png +0 -0
- data/docs/redisrpc_example.svg +329 -0
- data/examples/calc.rb +32 -0
- data/examples/client.rb +39 -0
- data/examples/server.rb +12 -0
- data/lib/redis-rpc.rb +137 -0
- data/lib/redis-rpc/version.rb +3 -0
- data/redis-rpc.gemspec +45 -0
- data/spec/calculator_spec.rb +41 -0
- data/spec/redis-test.conf +3 -0
- data/spec/spec_helper.rb +56 -0
- metadata +156 -0
data/redis-rpc.gemspec
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/redis-rpc/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'redis-rpc'
|
6
|
+
s.version = RedisRpc::VERSION
|
7
|
+
s.license = 'GPLv3'
|
8
|
+
s.authors = ['Phuong Nguyen', 'Nathan Farrington']
|
9
|
+
s.email = ['nathan@nathanfarrington.com']
|
10
|
+
|
11
|
+
s.homepage = 'http://github.com/phuongnd08/redis-rpc-ruby'
|
12
|
+
s.summary = 'Lightweight RPC for Redis'
|
13
|
+
s.description = <<-DESCRIPTION
|
14
|
+
RedisRpc is the easiest to use RPC library in the world. (No small claim!) It
|
15
|
+
has implementations in Ruby, PHP, and Python.
|
16
|
+
|
17
|
+
Redis is a powerful in-memory data structure server that is useful for building
|
18
|
+
fast distributed systems. Redis implements message queue functionality with its
|
19
|
+
use of list data structures and the `LPOP`, `BLPOP`, and `RPUSH` commands.
|
20
|
+
RedisRpc implements a lightweight RPC mechanism using Redis message queues to
|
21
|
+
temporarily hold RPC request and response messages. These messages are encoded
|
22
|
+
as JSON strings for portability.
|
23
|
+
|
24
|
+
Many other RPC mechanisms are either programming language specific (e.g.
|
25
|
+
Java RMI) or require boiler-plate code for explicit typing (e.g. Thrift).
|
26
|
+
RedisRpc was designed to be extremely easy to use by eliminating boiler-plate
|
27
|
+
code while also being programming language neutral. High performance was not
|
28
|
+
an initial goal of RedisRpc and other RPC libraries are likely to have better
|
29
|
+
performance. Instead, RedisRpc has better programmer performance; it lets you
|
30
|
+
get something working immediately.
|
31
|
+
DESCRIPTION
|
32
|
+
s.has_rdoc = false
|
33
|
+
|
34
|
+
s.files = `git ls-files`.split("\n")
|
35
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
36
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
|
39
|
+
s.add_runtime_dependency 'redis'
|
40
|
+
s.add_runtime_dependency 'multi_json', '~>1.3'
|
41
|
+
|
42
|
+
s.add_development_dependency 'bundler'
|
43
|
+
s.add_development_dependency 'rake'
|
44
|
+
s.add_development_dependency 'rspec'
|
45
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.expand_path( '../spec_helper.rb', __FILE__ )
|
2
|
+
require File.expand_path( '../../examples/calc.rb', __FILE__ )
|
3
|
+
|
4
|
+
describe Calculator do
|
5
|
+
[true,false].each do |over_redisrpc|
|
6
|
+
context "when run #{( over_redisrpc ? 'over redisrpc' : 'locally')}" do
|
7
|
+
|
8
|
+
if( over_redisrpc )
|
9
|
+
let(:rpc_server_builder){ lambda{ RedisRpc::Server.new( Redis.new($REDIS_CONFIG), 'calc', Calculator.new ) } }
|
10
|
+
before(:each) do
|
11
|
+
@server_pid = fork{ rpc_server_builder.call.run }
|
12
|
+
end
|
13
|
+
after(:each){ Process.kill(9, @server_pid); rpc_server_builder.call.flush_queue! }
|
14
|
+
let(:calculator){ RedisRpc::Client.new( $REDIS,'calc', 1) }
|
15
|
+
else
|
16
|
+
let(:calculator){ Calculator.new }
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should calculate' do
|
20
|
+
calculator.val.should == 0.0
|
21
|
+
calculator.add(3).should == 3.0
|
22
|
+
calculator.sub(2).should == 1.0
|
23
|
+
calculator.mul(14).should == 14.0
|
24
|
+
calculator.div(7).should == 2.0
|
25
|
+
calculator.val.should == 2.0
|
26
|
+
calculator.clr.should == 0.0
|
27
|
+
calculator.val.should == 0.0
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should raise when missing method is called' do
|
31
|
+
expect{ calculator.a_missing_method }.to raise_error(
|
32
|
+
over_redisrpc ? RedisRpc::RemoteException : NoMethodError
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should raise timeout when execution expires' do
|
37
|
+
expect{ calculator.send(:sleep,2) }.to raise_error RedisRpc::TimeoutException
|
38
|
+
end if over_redisrpc
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
begin
|
3
|
+
Bundler.require(:default,:development)
|
4
|
+
rescue Bundler::BundlerError => e
|
5
|
+
$stderr.puts e.message
|
6
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
7
|
+
exit e.status_code
|
8
|
+
end
|
9
|
+
|
10
|
+
def MultiJson.default_adapter
|
11
|
+
:ok_json
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.before :suite do
|
17
|
+
raise 'redis-server must be on your path to run this test' if `which redis-server`.empty?
|
18
|
+
$REDIS_CONF_PATH = File.expand_path('../redis-test.conf',__FILE__)
|
19
|
+
|
20
|
+
redis_conf_contents = File.read($REDIS_CONF_PATH)
|
21
|
+
raise "pidfile must be specified in #{$REDIS_CONF_PATH}" unless redis_conf_contents['pidfile']
|
22
|
+
|
23
|
+
$REDIS_CONFIG = {
|
24
|
+
:host => 'localhost',
|
25
|
+
:port => (redis_conf_contents.match(/port ([0-9]+)/)[1].to_i rescue 6379),
|
26
|
+
:db => 15 # we'll be flushing regularly; db 15 is traditionally reserved for test
|
27
|
+
}
|
28
|
+
|
29
|
+
$stdout.write "Starting Redis on port #{$REDIS_CONFIG[:port]}... "; $stdout.flush
|
30
|
+
`redis-server #{$REDIS_CONF_PATH}`
|
31
|
+
puts 'Done.'
|
32
|
+
|
33
|
+
$REDIS = Redis.new($REDIS_CONFIG)
|
34
|
+
begin
|
35
|
+
$REDIS.ping
|
36
|
+
rescue Timeout::Error, Errno::ECONNREFUSED
|
37
|
+
retries ||= 3
|
38
|
+
sleep 1 and retry unless (retries-=1).zero?
|
39
|
+
$stderr.puts 'Could not connect to Redis after 3 tries.'
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
config.around :each do |example|
|
45
|
+
$REDIS.flushdb
|
46
|
+
example.call
|
47
|
+
end
|
48
|
+
|
49
|
+
config.after :suite do
|
50
|
+
pidfile = (File.read($REDIS_CONF_PATH).match(/pidfile (.+)$/)[1].chomp rescue nil)
|
51
|
+
$stdout.write "\nKilling test redis server... "; $stdout.flush
|
52
|
+
Process.kill("KILL", File.read(pidfile).chomp.to_i )
|
53
|
+
File.unlink(pidfile)
|
54
|
+
puts 'Done.'
|
55
|
+
end
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redis-rpc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Phuong Nguyen
|
8
|
+
- Nathan Farrington
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2018-09-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: redis
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: multi_json
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.3'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.3'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: bundler
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rake
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: rspec
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
description: |2
|
85
|
+
RedisRpc is the easiest to use RPC library in the world. (No small claim!) It
|
86
|
+
has implementations in Ruby, PHP, and Python.
|
87
|
+
|
88
|
+
Redis is a powerful in-memory data structure server that is useful for building
|
89
|
+
fast distributed systems. Redis implements message queue functionality with its
|
90
|
+
use of list data structures and the `LPOP`, `BLPOP`, and `RPUSH` commands.
|
91
|
+
RedisRpc implements a lightweight RPC mechanism using Redis message queues to
|
92
|
+
temporarily hold RPC request and response messages. These messages are encoded
|
93
|
+
as JSON strings for portability.
|
94
|
+
|
95
|
+
Many other RPC mechanisms are either programming language specific (e.g.
|
96
|
+
Java RMI) or require boiler-plate code for explicit typing (e.g. Thrift).
|
97
|
+
RedisRpc was designed to be extremely easy to use by eliminating boiler-plate
|
98
|
+
code while also being programming language neutral. High performance was not
|
99
|
+
an initial goal of RedisRpc and other RPC libraries are likely to have better
|
100
|
+
performance. Instead, RedisRpc has better programmer performance; it lets you
|
101
|
+
get something working immediately.
|
102
|
+
email:
|
103
|
+
- nathan@nathanfarrington.com
|
104
|
+
executables: []
|
105
|
+
extensions: []
|
106
|
+
extra_rdoc_files: []
|
107
|
+
files:
|
108
|
+
- ".gitignore"
|
109
|
+
- CHANGELOG.markdown
|
110
|
+
- Gemfile
|
111
|
+
- Gemfile.lock
|
112
|
+
- LICENSE
|
113
|
+
- README.markdown
|
114
|
+
- Rakefile
|
115
|
+
- VERSION
|
116
|
+
- docs/github-flavored-markdown.rb
|
117
|
+
- docs/redisrpc_example.ai
|
118
|
+
- docs/redisrpc_example.png
|
119
|
+
- docs/redisrpc_example.svg
|
120
|
+
- examples/calc.rb
|
121
|
+
- examples/client.rb
|
122
|
+
- examples/server.rb
|
123
|
+
- lib/redis-rpc.rb
|
124
|
+
- lib/redis-rpc/version.rb
|
125
|
+
- redis-rpc.gemspec
|
126
|
+
- spec/calculator_spec.rb
|
127
|
+
- spec/redis-test.conf
|
128
|
+
- spec/spec_helper.rb
|
129
|
+
homepage: http://github.com/phuongnd08/redis-rpc-ruby
|
130
|
+
licenses:
|
131
|
+
- GPLv3
|
132
|
+
metadata: {}
|
133
|
+
post_install_message:
|
134
|
+
rdoc_options: []
|
135
|
+
require_paths:
|
136
|
+
- lib
|
137
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
requirements: []
|
148
|
+
rubyforge_project:
|
149
|
+
rubygems_version: 2.4.5.2
|
150
|
+
signing_key:
|
151
|
+
specification_version: 4
|
152
|
+
summary: Lightweight RPC for Redis
|
153
|
+
test_files:
|
154
|
+
- spec/calculator_spec.rb
|
155
|
+
- spec/redis-test.conf
|
156
|
+
- spec/spec_helper.rb
|