asir 0.2.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/Gemfile +1 -2
  2. data/README.textile +4 -2
  3. data/VERSION +1 -1
  4. data/asir.gemspec +1 -4
  5. data/asir.riterate.yml +1 -0
  6. data/bin/asir +2 -1
  7. data/example/asir_control.sh +63 -1
  8. data/example/asir_control_client_http.rb +2 -2
  9. data/example/asir_control_client_resque.rb +16 -0
  10. data/example/asir_control_client_zmq.rb +3 -3
  11. data/example/config/asir_config.rb +20 -8
  12. data/example/ex02.rb +1 -1
  13. data/example/ex03.rb +2 -2
  14. data/example/ex04.rb +2 -2
  15. data/example/ex05.rb +1 -1
  16. data/example/ex06.rb +6 -5
  17. data/example/ex07.rb +2 -2
  18. data/example/ex08.rb +2 -2
  19. data/example/ex09.rb +2 -2
  20. data/example/ex10.rb +2 -2
  21. data/example/ex11.rb +5 -5
  22. data/example/ex12.rb +6 -6
  23. data/example/ex13.rb +4 -4
  24. data/example/ex14.rb +4 -4
  25. data/example/ex15.rb +2 -2
  26. data/example/ex16.rb +8 -8
  27. data/example/ex17.rb +12 -11
  28. data/example/ex18.rb +5 -5
  29. data/example/ex19.rb +3 -3
  30. data/example/ex20.rb +3 -3
  31. data/example/ex21.rb +3 -3
  32. data/example/ex22.rb +1 -1
  33. data/example/ex23.rb +2 -2
  34. data/example/ex24.rb +4 -4
  35. data/example/ex25.rb +41 -0
  36. data/example/example_helper.rb +38 -3
  37. data/example/sample_service.rb +4 -4
  38. data/hack_night/exercise/prob-3.rb +3 -3
  39. data/hack_night/exercise/prob-6.rb +2 -2
  40. data/hack_night/exercise/prob-7.rb +2 -2
  41. data/hack_night/solution/prob-2.rb +2 -2
  42. data/hack_night/solution/prob-3.rb +3 -3
  43. data/hack_night/solution/prob-6.rb +7 -6
  44. data/hack_night/solution/prob-7.rb +6 -6
  45. data/{spec → lab}/const_get_speed_spec.rb +0 -0
  46. data/lib/asir.rb +29 -7
  47. data/lib/asir/additional_data.rb +25 -0
  48. data/lib/asir/channel.rb +4 -5
  49. data/lib/asir/client.rb +29 -13
  50. data/lib/asir/config.rb +8 -0
  51. data/lib/asir/description.rb +34 -0
  52. data/lib/asir/environment.rb +96 -0
  53. data/lib/asir/error.rb +4 -1
  54. data/lib/asir/invoker.rb +14 -0
  55. data/lib/asir/main.rb +84 -103
  56. data/lib/asir/message.rb +1 -1
  57. data/lib/asir/poll_throttle.rb +53 -0
  58. data/lib/asir/retry_behavior.rb +1 -1
  59. data/lib/asir/thread_variable.rb +183 -0
  60. data/lib/asir/transport.rb +36 -23
  61. data/lib/asir/transport/beanstalk.rb +18 -52
  62. data/lib/asir/transport/conduit.rb +42 -0
  63. data/lib/asir/transport/connection_oriented.rb +32 -56
  64. data/lib/asir/transport/delegation.rb +5 -5
  65. data/lib/asir/transport/demux.rb +33 -0
  66. data/lib/asir/transport/file.rb +5 -3
  67. data/lib/asir/transport/payload_io.rb +8 -4
  68. data/lib/asir/transport/resque.rb +212 -0
  69. data/lib/asir/transport/stream.rb +19 -9
  70. data/lib/asir/transport/tcp_socket.rb +3 -2
  71. data/lib/asir/transport/zmq.rb +14 -17
  72. data/lib/asir/uri_config.rb +51 -0
  73. data/lib/asir/version.rb +1 -1
  74. data/spec/client_spec.rb +48 -0
  75. data/spec/demux_spec.rb +38 -0
  76. data/spec/json_spec.rb +0 -2
  77. data/spec/message_spec.rb +68 -0
  78. data/spec/performance_spec.rb +66 -0
  79. data/spec/spec_helper.rb +34 -0
  80. data/spec/thread_variable_spec.rb +135 -0
  81. data/spec/transport_spec.rb +82 -0
  82. metadata +28 -4
data/Gemfile CHANGED
@@ -7,8 +7,7 @@ source "http://rubygems.org"
7
7
  gem 'zmq', '~> 2.1.4'
8
8
 
9
9
  group :development do
10
- # gem "bundler", "~> 1.0.0"
11
- gem 'jeweler'
10
+ gem "bundler", ">= 1.0.0"
12
11
  gem "rspec", "~> 2.0"
13
12
 
14
13
  require File.expand_path('../spec/debug_helper', __FILE__)
data/README.textile CHANGED
@@ -28,10 +28,11 @@ h3. Features
28
28
  ** HTTP under WEBrick or as Rack application.
29
29
  ** Beanstalkd.
30
30
  ** ZeroMQ.
31
+ ** Resque.
31
32
  ** Buffered transports.
32
33
  ** Broadcast transports.
33
34
  ** Fallback transports.
34
- ** Time-decaying retry logic.
35
+ ** Time-decaying retry and polling logic.
35
36
  * Support for multiple encodings:
36
37
  ** Marshal.
37
38
  ** XML.
@@ -42,7 +43,8 @@ h3. Features
42
43
  ** Chained encodings.
43
44
  ** Signed payloads.
44
45
 
45
- h2. Platform support.
46
+ h2. Platform support
47
+
46
48
  * CRuby 1.8.7
47
49
  * CRuby 1.9.3-head
48
50
  * CRuby 2.0-head
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 1.0.1
data/asir.gemspec CHANGED
@@ -1,11 +1,8 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
5
2
 
6
3
  Gem::Specification.new do |s|
7
4
  s.name = %q{asir}
8
- s.version = "0.2.0"
5
+ s.version = "1.0.1"
9
6
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
7
  s.authors = ["Kurt Stephens"]
11
8
  s.date = %q{2012-04-03}
data/asir.riterate.yml CHANGED
@@ -20,6 +20,7 @@ riterate:
20
20
  - "Design"
21
21
  - "Design: Nouns"
22
22
  - "Design: Verbs"
23
+ - "Abstraction Leads to Rich Features"
23
24
  - "Simple"
24
25
  - "Client-Side Message"
25
26
  - "Server-Side"
data/bin/asir CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  # -*- ruby -*-
3
- $: << File.expand_path('../../lib', __FILE__)
3
+ require 'rubygems'
4
+ $:.unshift File.expand_path('../../lib', __FILE__)
4
5
  require 'asir/main'
5
6
  exit ASIR::Main.new.parse_args!.run!.exit_code
6
7
 
@@ -4,21 +4,83 @@ dir="$(cd "$(dirname $0)" && /bin/pwd)"
4
4
  PATH="$dir/../bin:$PATH"
5
5
  export RUBYLIB="$dir/../example:$dir/../lib"
6
6
  asir="asir verbose=9 config_rb=$dir/config/asir_config.rb"
7
-
7
+ args="$*"
8
+ args="${args:-ALL}"
8
9
  # set -e
10
+
11
+ #############################
12
+
13
+ case "$args"
14
+ in
15
+ *webrick*|*ALL*)
16
+
9
17
  $asir start webrick worker
10
18
  sleep 1
19
+ $asir pid webrick worker
20
+ if $asir alive webrick worker; then
21
+ echo "alive webrick worker"
22
+ fi
11
23
 
12
24
  ruby "$dir/asir_control_client_http.rb"
13
25
  sleep 1
14
26
 
15
27
  $asir stop webrick worker
16
28
  sleep 1
29
+ $asir pid webrick worker
30
+
31
+ ;;
32
+ esac
33
+
34
+ #############################
35
+
36
+ case "$args"
37
+ in
38
+ *zmq*|*ALL*)
17
39
 
18
40
  $asir start zmq worker
19
41
  sleep 1
42
+ $asir pid zmq worker
43
+ if $asir alive zmq worker; then
44
+ echo "alive"
45
+ fi
20
46
 
21
47
  ruby "$dir/asir_control_client_zmq.rb"
22
48
  sleep 1
23
49
 
50
+ $asir stop zmq worker
51
+ sleep 1
52
+ $asir pid zmq worker
53
+
54
+ ;;
55
+ esac
56
+
57
+ #############################
58
+
59
+ case "$args"
60
+ in
61
+ *resque*|*ALL*)
62
+
63
+ $asir start resque conduit
64
+ sleep 1
65
+ if $asir alive resque conduit; then
66
+ echo "resque conduit alive"
67
+ fi
68
+ $asir start resque worker
69
+ sleep 1
70
+ $asir pid resque worker
71
+ if $asir alive resque worker; then
72
+ echo "resque worker alive"
73
+ fi
74
+
75
+ ruby "$dir/asir_control_client_resque.rb"
76
+ sleep 1
77
+ $asir stop resque worker
78
+ sleep 1
79
+ $asir stop resque conduit
80
+
81
+ ;;
82
+ esac
83
+
84
+ #############################
85
+
24
86
  exit 0
@@ -2,10 +2,10 @@ require 'example_helper'
2
2
  require 'asir/transport/http'
3
3
  require 'asir/coder/marshal'
4
4
  begin
5
- Email.client.transport = t =
5
+ Email.asir.transport = t =
6
6
  ASIR::Transport::HTTP.new(:uri => "http://localhost:30000/asir")
7
7
  t.encoder = ASIR::Coder::Marshal.new
8
- pr Email.client.send_email(:pdf_invoice,
8
+ pr Email.asir.send_email(:pdf_invoice,
9
9
  :to => "user@email.com",
10
10
  :customer => @customer)
11
11
  ensure
@@ -0,0 +1,16 @@
1
+ require 'example_helper'
2
+ gem 'resque'
3
+ require 'asir/transport/resque'
4
+ require 'asir/coder/marshal'
5
+ begin
6
+ Email.asir.transport = t =
7
+ ASIR::Transport::Resque.new
8
+ t.one_way = true
9
+ t.encoder = ASIR::Coder::Marshal.new
10
+ pr Email.asir.send_email(:pdf_invoice,
11
+ :to => "user@email.com",
12
+ :customer => @customer)
13
+ ensure
14
+ t.close rescue nil
15
+ end
16
+
@@ -2,11 +2,11 @@ require 'example_helper'
2
2
  require 'asir/transport/zmq'
3
3
  require 'asir/coder/marshal'
4
4
  begin
5
- Email.client.transport = t =
6
- ASIR::Transport::Zmq.new :uri => "tcp://localhost:31000" # "/asir"
5
+ Email.asir.transport = t =
6
+ ASIR::Transport::Zmq.new(:uri => "tcp://localhost:31000") # "/asir"
7
7
  t.one_way = true
8
8
  t.encoder = ASIR::Coder::Marshal.new
9
- pr Email.client.send_email(:pdf_invoice,
9
+ pr Email.asir.send_email(:pdf_invoice,
10
10
  :to => "user@email.com",
11
11
  :customer => @customer)
12
12
  ensure
@@ -1,13 +1,15 @@
1
1
  # Used by asir/bin/asir.
2
2
  # Configures asir worker transport and error logging.
3
- # asir object is bound to ASIR::Main instance.
3
+ # asir object is bound to ASIR::Environment instance.
4
4
 
5
- $stderr.puts "asir.verb = #{asir.verb.inspect}"
6
- case asir.verb
7
- when :config
5
+ $stderr.puts "asir.phase = #{asir.phase.inspect}" if asir.verbose >= 1
6
+ case asir.phase
7
+ when :configure
8
8
  # NOTHING
9
9
  true
10
10
  when :environment
11
+ require 'rubygems'
12
+
11
13
  require 'asir'
12
14
  require 'asir/transport/file'
13
15
  require 'asir/coder/marshal'
@@ -17,6 +19,9 @@ when :environment
17
19
  require 'example_helper'
18
20
  require 'sample_service'
19
21
  require 'unsafe_service'
22
+ when :start
23
+ # NOTHING
24
+ true
20
25
  when :transport
21
26
  # Compose with Marshal for final coding.
22
27
  coder = ASIR::Coder::Marshal.new
@@ -32,18 +37,25 @@ when :transport
32
37
  # Setup requested Transport.
33
38
  case asir.adjective
34
39
  when :beanstalk
40
+ require 'asir/transport/beanstalk'
35
41
  transport = ASIR::Transport::Beanstalk.new
36
- transport[:worker_processes] = 3
37
42
  when :http, :webrick
43
+ require 'asir/transport/webrick'
38
44
  transport = ASIR::Transport::Webrick.new
39
45
  transport.uri = "http://localhost:#{30000 + asir.identifier.to_s.to_i}/asir"
40
46
  when :rack
47
+ require 'asir/transport/rack'
41
48
  transport = ASIR::Transport::Rack.new
42
49
  transport.uri = "http://localhost:#{30000 + asir.identifier.to_s.to_i}/asir"
43
50
  when :zmq
51
+ reqiore 'asir/transport/zmq'
44
52
  transport = ASIR::Transport::Zmq.new
45
53
  transport.one_way = true
46
54
  transport.uri = "tcp://localhost:#{31000 + asir.identifier.to_s.to_i}" # /asir"
55
+ when :resque
56
+ gem 'resque'
57
+ require 'asir/transport/resque'
58
+ transport = ASIR::Transport::Resque.new
47
59
  else
48
60
  raise "Cannot configure Transport for #{asir.adjective}"
49
61
  end
@@ -51,13 +63,13 @@ when :transport
51
63
  transport.encoder = coder
52
64
  transport._logger = STDERR
53
65
  transport._log_enabled = true
54
- transport.verbose = 3
66
+ # transport.verbose = 3
55
67
  transport.on_exception =
56
- lambda { | transport, exc, phase, message, *rest |
68
+ lambda { | transport, exc, phase, message, result |
57
69
  error_transport.send_request(message)
58
70
  }
59
71
 
60
72
  transport
61
73
  else
62
- $stderr.puts "Warning: unhandled asir.verb: #{asir.verb.inspect}"
74
+ $stderr.puts "Warning: unhandled asir.phase: #{asir.phase.inspect}"
63
75
  end
data/example/ex02.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  # In-core, in-process service
3
3
 
4
4
  require 'example_helper'
5
- pr Email.client.send_email(:pdf_invoice,
5
+ pr Email.asir.send_email(:pdf_invoice,
6
6
  :to => "user@email.com",
7
7
  :customer => @customer)
8
8
 
data/example/ex03.rb CHANGED
@@ -4,10 +4,10 @@
4
4
 
5
5
  require 'example_helper'
6
6
  begin
7
- Email.client.transport = t =
7
+ Email.asir.transport = t =
8
8
  ASIR::Transport::Subprocess.new
9
9
 
10
- pr Email.client.send_email(:pdf_invoice,
10
+ pr Email.asir.send_email(:pdf_invoice,
11
11
  :to => "user@email.com",
12
12
  :customer => @customer)
13
13
  end
data/example/ex04.rb CHANGED
@@ -4,11 +4,11 @@
4
4
  require 'example_helper'
5
5
  begin
6
6
  File.unlink(service_log = "#{__FILE__}.service.log") rescue nil
7
- Email.client.transport = t =
7
+ Email.asir.transport = t =
8
8
  ASIR::Transport::File.new(:file => service_log)
9
9
  t.encoder =
10
10
  ASIR::Coder::Yaml.new
11
- pr Email.client.send_email(:pdf_invoice,
11
+ pr Email.asir.send_email(:pdf_invoice,
12
12
  :to => "user@email.com",
13
13
  :customer => @customer)
14
14
  ensure
data/example/ex05.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  require 'example_helper'
5
5
  begin
6
6
  service_log = "#{__FILE__.sub('ex05', 'ex04')}.service.log"
7
- Email.client.transport = t =
7
+ Email.asir.transport = t =
8
8
  ASIR::Transport::File.new(:file => service_log)
9
9
  t.encoder =
10
10
  ASIR::Coder::Yaml.new
data/example/ex06.rb CHANGED
@@ -1,19 +1,20 @@
1
1
  # !SLIDE :capture_code_output true
2
2
  # One-way, named pipe service
3
3
 
4
+ $stderr.puts " #{$$} at #{__FILE__}:#{__LINE__}"
5
+
4
6
  require 'example_helper'
5
7
  begin
6
8
  File.unlink(service_pipe = "service.pipe") rescue nil
7
- Email.client.transport = t =
9
+ Email.asir.transport = t =
8
10
  ASIR::Transport::File.new(:file => service_pipe)
9
11
  t.encoder =
10
12
  ASIR::Coder::Yaml.new
11
- t.prepare_pipe_server!
12
13
  server_process do
13
- t.run_pipe_server!
14
+ t.prepare_server!
15
+ t.run_server!
14
16
  end
15
- sleep 1
16
- pr Email.client.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
17
+ pr Email.asir.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
17
18
  ensure
18
19
  t.close; sleep 1; server_kill
19
20
  end
data/example/ex07.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  require 'example_helper'
5
5
  begin
6
6
  File.unlink(service_pipe = "service.pipe") rescue nil
7
- Email.client.transport = t =
7
+ Email.asir.transport = t =
8
8
  ASIR::Transport::File.new(:file => service_pipe)
9
9
  t.encoder =
10
10
  ASIR::Coder::Chain.new(:encoders =>
@@ -16,7 +16,7 @@ begin
16
16
  server_process do
17
17
  t.run_pipe_server!
18
18
  end
19
- pr Email.client.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
19
+ pr Email.asir.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
20
20
  ensure
21
21
  t.close; sleep 1; server_kill
22
22
  end
data/example/ex08.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  require 'example_helper'
5
5
  begin
6
6
  File.unlink(service_pipe = "service.pipe") rescue nil
7
- Email.client.transport = t =
7
+ Email.asir.transport = t =
8
8
  ASIR::Transport::File.new(:file => service_pipe)
9
9
  t.encoder =
10
10
  ASIR::Coder::Chain.new(:encoders =>
@@ -17,7 +17,7 @@ begin
17
17
  t.run_pipe_server!
18
18
  end
19
19
  s.secret = 'I do not know the secret! :('
20
- pr Email.client.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
20
+ pr Email.asir.send_email(:pdf_invoice, :to => "user@email.com", :customer => @customer)
21
21
  ensure
22
22
  t.close; sleep 1; server_kill
23
23
  end
data/example/ex09.rb CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  require 'example_helper'
5
5
  begin
6
- Email.client.transport = t =
6
+ Email.asir.transport = t =
7
7
  ASIR::Transport::TcpSocket.new(:port => 30909)
8
8
  t.encoder =
9
9
  ASIR::Coder::Marshal.new
@@ -11,7 +11,7 @@ begin
11
11
  server_process do
12
12
  t.run_server!
13
13
  end
14
- pr Email.client.send_email(:pdf_invoice,
14
+ pr Email.asir.send_email(:pdf_invoice,
15
15
  :to => "user@email.com", :customer => @customer)
16
16
  ensure
17
17
  t.close; sleep 1; server_kill
data/example/ex10.rb CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  require 'example_helper'
5
5
  begin
6
- Email.client.transport = t =
6
+ Email.asir.transport = t =
7
7
  ASIR::Transport::TcpSocket.new(:port => 30910)
8
8
  t.encoder =
9
9
  ASIR::Coder::Marshal.new
@@ -11,7 +11,7 @@ begin
11
11
  server_process do
12
12
  t.run_server!
13
13
  end
14
- pr Email.client.do_raise("Raise Me!")
14
+ pr Email.asir.do_raise("Raise Me!")
15
15
  rescue Exception => err
16
16
  pr [ :exception, err ]
17
17
  ensure
data/example/ex11.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  require 'example_helper'
5
5
  begin
6
6
  File.unlink(service_log = "#{__FILE__}.service.log") rescue nil
7
- Email.client.transport = t =
7
+ Email.asir.transport = t =
8
8
  ASIR::Transport::Fallback.new(:transports => [
9
9
  tcp = ASIR::Transport::TcpSocket.new(:port => 31911,
10
10
  :encoder => ASIR::Coder::Marshal.new),
@@ -14,13 +14,13 @@ begin
14
14
  ASIR::Transport::Subprocess.new,
15
15
  ]),
16
16
  ])
17
- pr Email.client.send_email(:pdf_invoice,
17
+ pr Email.asir.send_email(:pdf_invoice,
18
18
  :to => "user@email.com", :customer => @customer)
19
19
  server_process do
20
20
  tcp.prepare_server!
21
21
  tcp.run_server!
22
- end; sleep 2
23
- pr Email.client.send_email(:pdf_invoice,
22
+ end
23
+ pr Email.asir.send_email(:pdf_invoice,
24
24
  :to => "user2@email.com", :customer => @customer)
25
25
  ensure
26
26
  file.close rescue nil;
@@ -38,7 +38,7 @@ end
38
38
  # EXPECT: service.log" contents:
39
39
  # EXPECT: --- !ruby/object:ASIR::Message
40
40
  # EXPECT: :transport_exceptions:
41
- # EXPECT: ASIR::Error: Cannot connect to ASIR::Transport::TcpSocket tcp://127.0.0.1:
41
+ # EXPECT: Cannot connect to ASIR::Transport::TcpSocket tcp://127.0.0.1:
42
42
  # EXPECT: arguments:
43
43
  # EXPECT: - :pdf_invoice
44
44
  # EXPECT/: :to: user@email.com