skein 0.3.2 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7343801d33cd7284635f64439201546a196cafbe
4
- data.tar.gz: b21b94bd2691c4b295dc521c9ab7f0f6c1b3c08b
3
+ metadata.gz: ff3221a3eff25a91df8e35a5c1fbcc7aa220c6c3
4
+ data.tar.gz: 390343d71f7ab2e9a3f854463a5533f009f8c618
5
5
  SHA512:
6
- metadata.gz: f60918e1da256d70c85474ce4e898286ca793715baf437f3cc2b212ecd884239bb4e92785665ee7135450aa0ad2efc27e4d4234fed2af2fadabf5b0413ec481f
7
- data.tar.gz: ec3a51cbba42f4694ee49809798dffa4008fe9d997b6ae4f7e4ecca774823e75d5687dd6b5bc701423cca5d302ac9f6e447898c5943af11f53d4f56f1b4ab40b
6
+ metadata.gz: f89a9dbacd906a33742294cb909097d213ce7f4d6318aba28df1bb151a9fe6256d91b1b84454a1fc2e7fe1a3b70b08bc966ecae8ff6329e2f40824d062ddb996
7
+ data.tar.gz: 57754a31620ec832354dba43ca9387fe75c2e91fc7d8d44ac4c45a90f9e5f0dd7a4650d9a34c5fbab6140aec95501f8eb26d2258510d74809f85831993ac5e6c
@@ -4,7 +4,7 @@ GEM
4
4
  addressable (2.5.0)
5
5
  public_suffix (~> 2.0, >= 2.0.2)
6
6
  birling (0.1.3)
7
- builder (3.2.2)
7
+ builder (3.2.3)
8
8
  descendants_tracker (0.0.4)
9
9
  thread_safe (~> 0.3, >= 0.3.1)
10
10
  faraday (0.9.2)
@@ -18,45 +18,44 @@ GEM
18
18
  multi_json (>= 1.7.5, < 2.0)
19
19
  nokogiri (~> 1.6.0)
20
20
  oauth2
21
- hashie (3.4.6)
21
+ hashie (3.5.5)
22
22
  highline (1.7.8)
23
- jeweler (2.1.2)
23
+ jeweler (2.3.3)
24
24
  builder
25
25
  bundler (>= 1.0)
26
26
  git (>= 1.2.5)
27
27
  github_api (~> 0.11.0)
28
28
  highline (>= 1.6.15)
29
29
  nokogiri (>= 1.5.10)
30
+ psych (~> 2.2)
30
31
  rake
31
32
  rdoc
32
- semver
33
+ semver2
33
34
  jwt (1.5.6)
34
35
  mini_portile2 (2.1.0)
35
36
  multi_json (1.12.1)
36
- multi_xml (0.5.5)
37
+ multi_xml (0.6.0)
37
38
  multipart-post (2.0.0)
38
39
  nokogiri (1.6.8.1)
39
40
  mini_portile2 (~> 2.1.0)
40
- nokogiri (1.6.8.1-java)
41
- oauth2 (1.2.0)
42
- faraday (>= 0.8, < 0.10)
41
+ oauth2 (1.3.0)
42
+ faraday (>= 0.8, < 0.11)
43
43
  jwt (~> 1.0)
44
44
  multi_json (~> 1.3)
45
45
  multi_xml (~> 0.5)
46
46
  rack (>= 1.2, < 3)
47
- power_assert (0.3.1)
48
- public_suffix (2.0.4)
47
+ power_assert (1.0.1)
48
+ psych (2.2.4)
49
+ public_suffix (2.0.5)
49
50
  rack (2.0.1)
50
- rake (11.3.0)
51
- rdoc (5.0.0)
52
- semver (1.0.1)
53
- test-unit (3.2.1)
51
+ rake (12.0.0)
52
+ rdoc (5.1.0)
53
+ semver2 (3.4.2)
54
+ test-unit (3.2.3)
54
55
  power_assert
55
- thread_safe (0.3.5)
56
- thread_safe (0.3.5-java)
56
+ thread_safe (0.3.6)
57
57
 
58
58
  PLATFORMS
59
- java
60
59
  ruby
61
60
 
62
61
  DEPENDENCIES
@@ -66,4 +65,4 @@ DEPENDENCIES
66
65
  test-unit
67
66
 
68
67
  BUNDLED WITH
69
- 1.13.6
68
+ 1.14.5
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2016 Scott Tadman, PostageApp
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ require 'jeweler'
9
9
  Jeweler::Tasks.new do |gem|
10
10
  gem.name = 'skein'
11
11
  gem.homepage = 'http://github.com/postageapp/skein'
12
- gem.license = 'closed'
12
+ gem.license = 'MIT'
13
13
  gem.summary = %Q{RabbitMQ RPC/PubSub Library}
14
14
  gem.description = %Q{Wrapper for RabbitMQ that makes blocking RPC calls and handles pub-sub broadcasts.}
15
15
  gem.email = 'tadman@postageapp.com'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.2
1
+ 0.3.5
@@ -10,8 +10,8 @@ class Skein::Client < Skein::Connected
10
10
  new.rpc(*args)
11
11
  end
12
12
 
13
- def self.receiver(*args)
14
- new.receiver(*args)
13
+ def self.worker(*args)
14
+ new.worker(*args)
15
15
  end
16
16
 
17
17
  def self.publisher(*args)
@@ -37,8 +37,9 @@ class Skein::Client < Skein::Connected
37
37
  )
38
38
  end
39
39
 
40
- def receiver
41
- Skein::Client::Receiver.new(
40
+ def worker(queue_name)
41
+ Skein::Client::Worker.new(
42
+ queue_name,
42
43
  connection: self.connection,
43
44
  context: self.context
44
45
  )
@@ -16,16 +16,18 @@ class Skein::Client::Subscriber < Skein::Connected
16
16
  @subscribe_queue.bind(@exchange, routing_key: routing_key)
17
17
  end
18
18
 
19
- def listen
19
+ def listen(block = true)
20
20
  case (@subscribe_queue.class.to_s.split(/::/)[0])
21
21
  when 'Bunny'
22
- @subscribe_queue.subscribe(block: true) do |delivery_info, properties, payload|
22
+ @subscribe_queue.subscribe(block: block) do |delivery_info, properties, payload|
23
23
  yield(JSON.load(payload), delivery_info, properties)
24
24
  end
25
25
  when 'MarchHare'
26
- @subscribe_queue.subscribe(block: true) do |metadata, payload|
26
+ @subscribe_queue.subscribe(block: block) do |metadata, payload|
27
27
  yield(JSON.load(payload), metadata)
28
28
  end
29
+ else
30
+ raise "Unknown queue type #{@subscribe_queue.class}, cannot listen."
29
31
  end
30
32
  end
31
33
  end
@@ -3,7 +3,7 @@ require 'json'
3
3
  class Skein::Client::Worker < Skein::Connected
4
4
  # == Instance Methods =====================================================
5
5
 
6
- def initialize(queue_name, exchange_name: nil, connection: nil, context: nil)
6
+ def initialize(queue_name, exchange_name: nil, connection: nil, context: nil, concurrency: nil)
7
7
  super(connection: connection, context: context)
8
8
 
9
9
  lock do
@@ -17,36 +17,82 @@ class Skein::Client::Worker < Skein::Connected
17
17
  end
18
18
 
19
19
  @handler = Skein::Handler.for(self)
20
+ @received = Queue.new
21
+ @replies = Queue.new
22
+ @concurrency = concurrency && concurrency.to_i || 1
23
+ @threads = [ ]
20
24
 
21
- @thread = Thread.new do
25
+ @threads << Thread.new do
22
26
  Thread.abort_on_exception = true
23
27
 
24
28
  Skein::Adapter.subscribe(@queue) do |payload, delivery_tag, reply_to|
25
- @handler.handle(payload) do |reply_json|
26
- channel.acknowledge(delivery_tag, true)
27
-
28
- if (reply_to)
29
- @reply_exchange.publish(
30
- reply_json,
31
- routing_key: reply_to,
32
- content_type: 'application/json'
33
- )
29
+ @received << [ payload, delivery_tag, reply_to ]
30
+ end
31
+ end
32
+
33
+ @threads << Thread.new do
34
+ Thread.abort_on_exception = true
35
+
36
+ loop do
37
+ payload, delivery_tag, reply_to, reply_json = @replies.pop
38
+
39
+ channel.acknowledge(delivery_tag, true)
40
+
41
+ if (reply_to)
42
+ @reply_exchange.publish(
43
+ reply_json,
44
+ routing_key: reply_to,
45
+ content_type: 'application/json'
46
+ )
47
+ end
48
+ end
49
+ end
50
+
51
+ @concurrency.times do
52
+ @threads << Thread.new do
53
+ Thread.abort_on_exception = true
54
+
55
+ loop do
56
+ payload, delivery_tag, reply_to = @received.pop
57
+ thread = Thread.current
58
+
59
+ @handler.handle(payload) do |reply_json|
60
+ @replies << [ payload, delivery_tag, reply_to, reply_json ]
61
+
62
+ if (thread == Thread.current)
63
+ thread = nil
64
+ else
65
+ thread.wakeup
66
+ end
34
67
  end
68
+
69
+ thread and Thread.stop
35
70
  end
36
71
  end
37
72
  end
38
73
  end
74
+
75
+ self.after_initialize
76
+ end
77
+
78
+ # Extend this in derived classes to implement any desired customization to
79
+ # be performed after initialization
80
+ def after_initialize
39
81
  end
40
82
 
41
83
  def close
42
- @thread.kill
43
- @thread.join
84
+ @threads.each do |thread|
85
+ thread.kill
86
+ thread.join
87
+ end
44
88
 
45
89
  super
46
90
  end
47
91
 
48
92
  def join
49
- @thread and @thread.join
93
+ @threads.each do |thread|
94
+ thread.join
95
+ end
50
96
  end
51
97
 
52
98
  def async?
@@ -2,25 +2,27 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: skein 0.3.2 ruby lib
5
+ # stub: skein 0.3.5 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "skein".freeze
9
- s.version = "0.3.2"
9
+ s.version = "0.3.5"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Scott Tadman".freeze]
14
- s.date = "2016-12-14"
14
+ s.date = "2017-03-20"
15
15
  s.description = "Wrapper for RabbitMQ that makes blocking RPC calls and handles pub-sub broadcasts.".freeze
16
16
  s.email = "tadman@postageapp.com".freeze
17
17
  s.executables = ["skein".freeze]
18
18
  s.extra_rdoc_files = [
19
+ "LICENSE.md",
19
20
  "README.md"
20
21
  ]
21
22
  s.files = [
22
23
  "Gemfile",
23
24
  "Gemfile.lock",
25
+ "LICENSE.md",
24
26
  "README.md",
25
27
  "RELEASES.md",
26
28
  "Rakefile",
@@ -65,10 +67,11 @@ Gem::Specification.new do |s|
65
67
  "test/unit/test_skein_rpc_error.rb",
66
68
  "test/unit/test_skein_rpc_request.rb",
67
69
  "test/unit/test_skein_support.rb",
70
+ "test/unit/test_skein_worker.rb",
68
71
  "tmp/.gitignore"
69
72
  ]
70
73
  s.homepage = "http://github.com/postageapp/skein".freeze
71
- s.licenses = ["closed".freeze]
74
+ s.licenses = ["MIT".freeze]
72
75
  s.rubygems_version = "2.5.2".freeze
73
76
  s.summary = "RabbitMQ RPC/PubSub Library".freeze
74
77
 
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'rubygems'
4
+ require 'optparse'
4
5
 
5
6
  gem 'eventmachine'
6
7
  require 'eventmachine'
@@ -12,8 +13,25 @@ require 'skein'
12
13
  # == Support Classes ========================================================
13
14
 
14
15
  class EchoWorker < Skein::Client::Worker
16
+ def initialize(*args, concurrency: nil, delay: nil, wait: false, verbose: false)
17
+ super(*args, concurrency: concurrency)
18
+
19
+ @delay = delay || 0.0
20
+ @wait = false
21
+ end
22
+
15
23
  def echo(*args)
16
- yield(*args)
24
+ if (@delay > 0)
25
+ EventMachine::Timer.new(self.delay) do
26
+ yield(*args)
27
+ end
28
+ elsif (@wait)
29
+ EventMachine.next_tick do
30
+ yield(*args)
31
+ end
32
+ else
33
+ yield(*args)
34
+ end
17
35
  end
18
36
 
19
37
  def async?
@@ -23,6 +41,38 @@ end
23
41
 
24
42
  # == Main ===================================================================
25
43
 
44
+ options = {
45
+ concurrency: 1,
46
+ delay: 0.0,
47
+ wait: false,
48
+ verbose: false
49
+ }
50
+
51
+ parser = OptionParser.new do |parser|
52
+ parser.on('-v', '--verbose') do
53
+ options[:verbose] = true
54
+ end
55
+
56
+ parser.on('-d', '--delay=n') do |n|
57
+ options[:delay] = n.to_f
58
+ end
59
+
60
+ parser.on('-c', '--concurrency=n') do |n|
61
+ options[:concurrency] = n.to_i
62
+ end
63
+
64
+ parser.on('-w', '--wait') do
65
+ options[:wait] = true
66
+ end
67
+
68
+ parser.on('-h', '--help') do
69
+ puts parser
70
+ exit(0)
71
+ end
72
+ end
73
+
74
+ args = parser.parse(*ARGV)
75
+
26
76
  EventMachine.run do
27
- EchoWorker.new('test_echo')
77
+ worker = EchoWorker.new('test_echo', options)
28
78
  end
@@ -5,14 +5,14 @@ class TestSkeinClient < Test::Unit::TestCase
5
5
  client = nil
6
6
 
7
7
  assert_no_threads do
8
- client = Skein::Client.new
8
+ begin
9
+ client = Skein::Client.new
9
10
 
10
- assert client.context
11
+ assert client.context
11
12
 
12
- client.close
13
+ ensure
14
+ client and client.close
15
+ end
13
16
  end
14
-
15
- # ensure
16
- # client and client.close
17
17
  end
18
18
  end
@@ -0,0 +1,16 @@
1
+ require_relative '../helper'
2
+
3
+ class TestSkeinWorker < Test::Unit::TestCase
4
+ def test_default
5
+ client = Skein::Client.new
6
+
7
+ worker = client.worker('test_queue')
8
+
9
+ assert worker
10
+
11
+ assert_equal false, worker.async?
12
+
13
+ ensure
14
+ client and client.close
15
+ end
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skein
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Tadman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-14 00:00:00.000000000 Z
11
+ date: 2017-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: birling
@@ -73,10 +73,12 @@ executables:
73
73
  - skein
74
74
  extensions: []
75
75
  extra_rdoc_files:
76
+ - LICENSE.md
76
77
  - README.md
77
78
  files:
78
79
  - Gemfile
79
80
  - Gemfile.lock
81
+ - LICENSE.md
80
82
  - README.md
81
83
  - RELEASES.md
82
84
  - Rakefile
@@ -121,10 +123,11 @@ files:
121
123
  - test/unit/test_skein_rpc_error.rb
122
124
  - test/unit/test_skein_rpc_request.rb
123
125
  - test/unit/test_skein_support.rb
126
+ - test/unit/test_skein_worker.rb
124
127
  - tmp/.gitignore
125
128
  homepage: http://github.com/postageapp/skein
126
129
  licenses:
127
- - closed
130
+ - MIT
128
131
  metadata: {}
129
132
  post_install_message:
130
133
  rdoc_options: []