shinq 0.1.0 → 0.2.0

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: 963044a99e6d106db2b057aada7d494cad2b08e7
4
- data.tar.gz: 0aed9ca078d588390f1f60e31848c890d67b6f47
3
+ metadata.gz: 27fb65cd784140db7180182ee23747354ea16316
4
+ data.tar.gz: d3b16bae80c1e983ddff5a417caa23ae28f1ad0b
5
5
  SHA512:
6
- metadata.gz: 335d663a56d4583364ca9c566347396488e3caa5170141c8f3b6dec869a1f9c6a99adbfc591721e4972b4859f1aa32de5cc0b5a2a853515d7d0e89218474af6f
7
- data.tar.gz: 36edfb7ed38029b700f71718e68549a3fcdb60e2a00a4bcf5aa90ff81ce6b0859fe5395702b94013a8b64513110cdb3fe4f24d68f0fd783d52ef2b74fdaecd3a
6
+ metadata.gz: d9636a00d1c4d5c9a57fa5a3bdf697bb0814fb3c3caa3f61f4dc775473fb967b0c4f81980609025aaf4d475553bee80d03e6d872f3b428724938aa3f2acc7280
7
+ data.tar.gz: 36076bca1dfb6cb3c6d89f18dada6116a22b0b8123ad3e1987980cc030c0d21eec495e0326590ceb6695779d7b32e5c2ece588aa4dc5b5dc98a3bef8fcf82230
data/README.md CHANGED
@@ -31,23 +31,70 @@ end
31
31
  ```
32
32
 
33
33
  ### Worker
34
+
35
+ #### Generate worker, migration file
36
+
37
+ ```
38
+ $ rails generate shinq:worker worker_name title:string
39
+ create db/migrate/20141110061243_create_worker_names.rb
40
+ create app/workers/worker_name.rb
41
+ ```
42
+
43
+ Generated worker file (app/workers/worker_name.rb)
34
44
  ```ruby
35
- class FooWorker < ActiveJob::Base
36
- aueue_as :my_queues #name of queue table
45
+ class WorkerName < ActiveJob::Base
46
+ queue_as :worker_names
37
47
 
38
48
  def perform(args)
39
- #perform asynchronous
49
+ #do something
40
50
  end
41
51
  end
42
52
  ```
43
53
 
54
+ Generated migration file
55
+ ```ruby
56
+ class CreateWorkerNames < ActiveRecord::Migration
57
+ def change
58
+ create_table :worker_names, {id: false, options: "ENGINE=QUEUE"} do |t|
59
+ t.string :job_id, null: false
60
+ t.string :title
61
+ t.datetime :enqueued_at, null: false
62
+ end
63
+ end
64
+ end
65
+ ```
66
+
67
+ #### migrate
68
+ ```
69
+ $ rake db:migrate
70
+ == 20141110061243 CreateWorkerNames: migrating ================================
71
+ -- create_table(:worker_names, {:id=>false, :options=>"ENGINE=QUEUE"})
72
+ -> 0.0260s
73
+ == 20141110061243 CreateWorkerNames: migrated (0.0261s) =======================
74
+
75
+ mysql> show create table worker_names\G
76
+ *************************** 1. row ***************************
77
+ Table: worker_names
78
+ Create Table: CREATE TABLE `worker_names` (
79
+ `job_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
80
+ `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
81
+ `enqueued_at` datetime NOT NULL
82
+ ) ENGINE=QUEUE DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
83
+ ```
84
+
44
85
  ### Enqueue
45
86
  ```ruby
46
- FooWorker.perform_later(foo: 'bar', baz: 'qux')
87
+ WorkerName.perform_later(title: 'foo')
47
88
  ```
48
89
 
49
90
  ### Worker execution
50
- TBD
91
+
92
+ #### Basic execution
93
+ ```
94
+ $ bundle exec shinq --worker worker_name
95
+ ```
96
+
97
+ You can specify some options. see `bundle exec shinq --help`
51
98
 
52
99
  ## Contributing
53
100
 
data/lib/shinq/cli.rb CHANGED
@@ -23,37 +23,37 @@ module Shinq
23
23
  def parse_options(args)
24
24
  opts = {}
25
25
  parser = OptionParser.new do |opt|
26
- opt.on('-d', '--daemon') do |v|
26
+ opt.on('-d', '--daemon', 'Daemonize process') do |v|
27
27
  opts[:daemonize] = v
28
28
  end
29
29
 
30
- opt.on('--worker value') do |v|
30
+ opt.on('--worker value', 'Name of worker class') do |v|
31
31
  opts[:worker_name] = v
32
32
  end
33
33
 
34
- opt.on('--process VALUE') do |v|
34
+ opt.on('--process VALUE', 'Number of workers') do |v|
35
35
  opts[:process] = v.to_i
36
36
  end
37
37
 
38
- opt.on('--queue-timeout VALUE') do |v|
38
+ opt.on('--queue-timeout VALUE', 'Waiting queue time(sec). use function of queue_wait(Q4M)') do |v|
39
39
  opts[:queue_timeout] = v.to_i
40
40
  end
41
41
 
42
- opt.on('--db-config VALUE') do |v|
42
+ opt.on('--db-config VALUE', 'Specify configuration file') do |v|
43
43
  raise OptionParseError, "#{v} does not exist" unless File.exist?(v)
44
44
  opts[:db_config] = YAML.load_file(v)
45
45
  end
46
46
 
47
- opt.on('--queue-database VALUE') do |v|
47
+ opt.on('--queue-database VALUE', 'Name of queue database') do |v|
48
48
  raise OptionParseError, "#{v}'s settings does not exist" unless opts[:db_config][v]
49
49
  opts[:queue_db] = v
50
50
  end
51
51
 
52
- opt.on('--require VALUE') do |v|
52
+ opt.on('--require VALUE', 'Add require path') do |v|
53
53
  opts[:require] = v
54
54
  end
55
55
 
56
- opt.on('-v', '--version') do |v|
56
+ opt.on('-v', '--version', 'Print version') do |v|
57
57
  puts "Shinq #{Shinq::VERSION}"
58
58
  exit(0)
59
59
  end
data/lib/shinq/client.rb CHANGED
@@ -35,6 +35,22 @@ module Shinq
35
35
  end
36
36
  end
37
37
 
38
+ def self.queue_stats(table_name:)
39
+ quoted = SQL::Maker::Quoting.quote(table_name)
40
+
41
+ stats_query = "queue_stats(#{quoted})"
42
+ result = Shinq.connection.query("select #{stats_query}")
43
+
44
+ stats = result.first[stats_query].split(/\n/).each_with_object({}) do |s, h|
45
+ (k,v) = s.split(/:/)
46
+ h[k.to_sym] = v.to_i
47
+ end
48
+
49
+ stats.merge(
50
+ queue_count: stats[:rows_removed] - stats[:rows_written]
51
+ )
52
+ end
53
+
38
54
  def self.done
39
55
  Shinq.connection.query('select queue_end()')
40
56
  end
data/shinq.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "shinq"
7
- spec.version = '0.1.0'
7
+ spec.version = '0.2.0'
8
8
  spec.authors = ["Ryoichi SEKIGUCHI"]
9
9
  spec.email = ["ryopeko@gmail.com"]
10
10
  spec.summary = %q{Worker and enqueuer for Q4M using the interface of ActiveJob.}
@@ -2,26 +2,95 @@ require 'spec_helper'
2
2
  require 'shinq'
3
3
  require 'shinq/client'
4
4
 
5
- describe "Integration" do
5
+ describe "Integration", skip: ENV['TRAVIS'] do
6
+ let(:queue_table) { 'queue_test' }
7
+
6
8
  before do
7
9
  load_database_config(Shinq)
8
10
  end
9
11
 
10
- context "When create queue", skip: ENV['TRAVIS'] do
11
- let(:queue_table) { 'queue_test' }
12
- let(:args) { {title: 'foo'} }
12
+ after do
13
+ Shinq.connection.query("delete from #{queue_table}")
14
+ end
15
+
16
+ describe "Shinq::Client.enqueue,dequeue" do
17
+ context "valid args" do
18
+ let(:args) { {title: 'foo'} }
19
+
20
+ before do
21
+ Shinq::Client.enqueue(
22
+ table_name: queue_table,
23
+ job_id: 'jobid',
24
+ args: args
25
+ )
26
+
27
+ @queue = Shinq::Client.dequeue(table_name: queue_table)
28
+ Shinq::Client.done
29
+ end
13
30
 
14
- before do
15
- Shinq::Client.enqueue(
16
- table_name: queue_table,
17
- job_id: 'jobid',
18
- args: args
19
- )
31
+ it { expect(@queue[:title]).to eq args[:title] }
32
+ end
20
33
 
21
- @queue = Shinq::Client.dequeue(table_name: queue_table)
22
- Shinq::Client.done
34
+ context "invalid args" do
35
+ it {
36
+ expect {
37
+ Shinq::Client.enqueue(
38
+ table_name: queue_table,
39
+ job_id: 'jobid',
40
+ args: Array.new
41
+ )
42
+ }.to raise_error(ArgumentError)
43
+ }
23
44
  end
45
+ end
46
+
47
+ describe "Shinq::Client.abort" do
48
+ context "When client has a queue" do
49
+ before do
50
+ Shinq::Client.enqueue(
51
+ table_name: queue_table,
52
+ job_id: 'jobid',
53
+ args: {title: 'foo'}
54
+ )
55
+
56
+ @queue_count = Shinq.connection.query("select count(*) as c from #{queue_table}").first['c']
57
+
58
+ Shinq::Client.dequeue(table_name: queue_table)
59
+ Shinq::Client.abort
24
60
 
25
- it { expect(@queue[:title]).to eq args[:title] }
61
+ @after_queue_count = Shinq.connection.query("select count(*) as c from #{queue_table}").first['c']
62
+ end
63
+
64
+ it { expect(@after_queue_count).to be @queue_count }
65
+ end
66
+
67
+ context "When client does not have a queue" do
68
+ it {
69
+ expect {
70
+ Shinq::Client.abort
71
+ }.to raise_error (/not in owner mode/)
72
+ }
73
+ end
74
+ end
75
+
76
+ describe "Shinq::Client.queue_stats" do
77
+ subject(:stats) {
78
+ Shinq::Client.queue_stats(table_name: queue_table)
79
+ }
80
+
81
+ it { expect(stats).to have_key :rows_written }
82
+ it { expect(stats).to have_key :rows_removed }
83
+ it { expect(stats).to have_key :wait_immediate }
84
+ it { expect(stats).to have_key :wait_delayed }
85
+ it { expect(stats).to have_key :wait_timeout }
86
+ it { expect(stats).to have_key :restored_by_abort }
87
+ it { expect(stats).to have_key :restored_by_close }
88
+ it { expect(stats).to have_key :bytes_total }
89
+ it { expect(stats).to have_key :bytes_removed }
90
+ it { expect(stats).to have_key :queue_count }
91
+
92
+ it "queue_count expect to be equal rows_removed - rows_written" do
93
+ expect(stats[:queue_count]).to eq (stats[:rows_removed] - stats[:rows_written])
94
+ end
26
95
  end
27
96
  end
@@ -12,6 +12,7 @@ describe Shinq::Configuration do
12
12
  it { is_expected.to respond_to(:default_db) }
13
13
  it { is_expected.to respond_to(:process) }
14
14
  it { is_expected.to respond_to(:queue_timeout) }
15
+ it { is_expected.to respond_to(:daemonize) }
15
16
  end
16
17
 
17
18
  describe ".new" do
@@ -42,9 +43,16 @@ describe Shinq::Configuration do
42
43
  end
43
44
 
44
45
  context "when default_db's config is present" do
45
- let(:configuration) { Shinq::Configuration.new(default_db: :test) }
46
-
47
- it {expect { configuration.default_db_config }.to raise_error(Shinq::ConfigurationError)}
46
+ let(:test_db_config) { {foo: :bar} }
47
+ let(:configuration) {
48
+ Shinq::Configuration.new(
49
+ default_db: :test,
50
+ db_config: {
51
+ test: test_db_config
52
+ })
53
+ }
54
+
55
+ it { expect(configuration.default_db_config).to be test_db_config }
48
56
  end
49
57
  end
50
58
 
data/spec/shinq_spec.rb CHANGED
@@ -31,7 +31,7 @@ describe Shinq do
31
31
  end
32
32
 
33
33
  describe ".configuration=" do
34
- context "when specify args" do
34
+ context "when specify args is Hash" do
35
35
  let(:shinq) { shinq_class }
36
36
  let(:args) { Hash.new }
37
37
 
@@ -39,6 +39,15 @@ describe Shinq do
39
39
  expect(shinq.configuration=(args)).to eq args
40
40
  end
41
41
  end
42
+
43
+ context "when specify args is Shinq::Configuration" do
44
+ let(:shinq) { shinq_class }
45
+ let(:args) { Shinq::Configuration.new({}) }
46
+
47
+ it 'is expect to return specified args' do
48
+ expect(shinq.configuration=(args)).to eq args
49
+ end
50
+ end
42
51
  end
43
52
 
44
53
  describe ".connection" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shinq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryoichi SEKIGUCHI
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-05 00:00:00.000000000 Z
11
+ date: 2014-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler