resque_sqs 1.25.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/HISTORY.md +467 -0
  3. data/LICENSE +20 -0
  4. data/README.markdown +866 -0
  5. data/Rakefile +70 -0
  6. data/bin/resque-sqs +81 -0
  7. data/bin/resque-sqs-web +27 -0
  8. data/lib/resque_sqs/errors.rb +13 -0
  9. data/lib/resque_sqs/failure/airbrake.rb +33 -0
  10. data/lib/resque_sqs/failure/base.rb +73 -0
  11. data/lib/resque_sqs/failure/multiple.rb +59 -0
  12. data/lib/resque_sqs/failure/redis.rb +108 -0
  13. data/lib/resque_sqs/failure/redis_multi_queue.rb +89 -0
  14. data/lib/resque_sqs/failure.rb +113 -0
  15. data/lib/resque_sqs/helpers.rb +107 -0
  16. data/lib/resque_sqs/job.rb +346 -0
  17. data/lib/resque_sqs/log_formatters/quiet_formatter.rb +7 -0
  18. data/lib/resque_sqs/log_formatters/verbose_formatter.rb +7 -0
  19. data/lib/resque_sqs/log_formatters/very_verbose_formatter.rb +8 -0
  20. data/lib/resque_sqs/logging.rb +18 -0
  21. data/lib/resque_sqs/plugin.rb +66 -0
  22. data/lib/resque_sqs/server/helpers.rb +52 -0
  23. data/lib/resque_sqs/server/public/favicon.ico +0 -0
  24. data/lib/resque_sqs/server/public/idle.png +0 -0
  25. data/lib/resque_sqs/server/public/jquery-1.3.2.min.js +19 -0
  26. data/lib/resque_sqs/server/public/jquery.relatize_date.js +95 -0
  27. data/lib/resque_sqs/server/public/poll.png +0 -0
  28. data/lib/resque_sqs/server/public/ranger.js +78 -0
  29. data/lib/resque_sqs/server/public/reset.css +44 -0
  30. data/lib/resque_sqs/server/public/style.css +91 -0
  31. data/lib/resque_sqs/server/public/working.png +0 -0
  32. data/lib/resque_sqs/server/test_helper.rb +19 -0
  33. data/lib/resque_sqs/server/views/error.erb +1 -0
  34. data/lib/resque_sqs/server/views/failed.erb +29 -0
  35. data/lib/resque_sqs/server/views/failed_job.erb +50 -0
  36. data/lib/resque_sqs/server/views/failed_queues_overview.erb +24 -0
  37. data/lib/resque_sqs/server/views/key_sets.erb +19 -0
  38. data/lib/resque_sqs/server/views/key_string.erb +11 -0
  39. data/lib/resque_sqs/server/views/layout.erb +44 -0
  40. data/lib/resque_sqs/server/views/next_more.erb +22 -0
  41. data/lib/resque_sqs/server/views/overview.erb +4 -0
  42. data/lib/resque_sqs/server/views/queues.erb +58 -0
  43. data/lib/resque_sqs/server/views/stats.erb +62 -0
  44. data/lib/resque_sqs/server/views/workers.erb +109 -0
  45. data/lib/resque_sqs/server/views/working.erb +72 -0
  46. data/lib/resque_sqs/server.rb +271 -0
  47. data/lib/resque_sqs/stat.rb +57 -0
  48. data/lib/resque_sqs/tasks.rb +83 -0
  49. data/lib/resque_sqs/vendor/utf8_util/utf8_util_18.rb +91 -0
  50. data/lib/resque_sqs/vendor/utf8_util/utf8_util_19.rb +5 -0
  51. data/lib/resque_sqs/vendor/utf8_util.rb +20 -0
  52. data/lib/resque_sqs/version.rb +3 -0
  53. data/lib/resque_sqs/worker.rb +779 -0
  54. data/lib/resque_sqs.rb +479 -0
  55. data/lib/tasks/redis_sqs.rake +161 -0
  56. data/lib/tasks/resque_sqs.rake +2 -0
  57. data/test/airbrake_test.rb +27 -0
  58. data/test/failure_base_test.rb +15 -0
  59. data/test/job_hooks_test.rb +465 -0
  60. data/test/job_plugins_test.rb +230 -0
  61. data/test/logging_test.rb +24 -0
  62. data/test/plugin_test.rb +116 -0
  63. data/test/redis-test-cluster.conf +115 -0
  64. data/test/redis-test.conf +115 -0
  65. data/test/resque-web_test.rb +59 -0
  66. data/test/resque_failure_redis_test.rb +19 -0
  67. data/test/resque_hook_test.rb +165 -0
  68. data/test/resque_test.rb +278 -0
  69. data/test/stdout +42 -0
  70. data/test/test_helper.rb +228 -0
  71. data/test/worker_test.rb +1080 -0
  72. metadata +202 -0
@@ -0,0 +1,57 @@
1
+ module ResqueSqs
2
+ # The stat subsystem. Used to keep track of integer counts.
3
+ #
4
+ # Get a stat: Stat[name]
5
+ # Incr a stat: Stat.incr(name)
6
+ # Decr a stat: Stat.decr(name)
7
+ # Kill a stat: Stat.clear(name)
8
+ module Stat
9
+ extend self
10
+
11
+ # Direct access to the Redis instance.
12
+ def redis
13
+ ResqueSqs.redis
14
+ end
15
+
16
+ # Returns the int value of a stat, given a string stat name.
17
+ def get(stat)
18
+ redis.get("stat:#{stat}").to_i
19
+ end
20
+
21
+ # Alias of `get`
22
+ def [](stat)
23
+ get(stat)
24
+ end
25
+
26
+ # For a string stat name, increments the stat by one.
27
+ #
28
+ # Can optionally accept a second int parameter. The stat is then
29
+ # incremented by that amount.
30
+ def incr(stat, by = 1)
31
+ redis.incrby("stat:#{stat}", by)
32
+ end
33
+
34
+ # Increments a stat by one.
35
+ def <<(stat)
36
+ incr stat
37
+ end
38
+
39
+ # For a string stat name, decrements the stat by one.
40
+ #
41
+ # Can optionally accept a second int parameter. The stat is then
42
+ # decremented by that amount.
43
+ def decr(stat, by = 1)
44
+ redis.decrby("stat:#{stat}", by)
45
+ end
46
+
47
+ # Decrements a stat by one.
48
+ def >>(stat)
49
+ decr stat
50
+ end
51
+
52
+ # Removes a stat from Redis, effectively setting it to 0.
53
+ def clear(stat)
54
+ redis.del("stat:#{stat}")
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,83 @@
1
+ # require 'resque_sqs/tasks'
2
+ # will give you the resque tasks
3
+
4
+ namespace :resque_sqs do
5
+ task :setup
6
+
7
+ desc "Start a Resque worker"
8
+ task :work => [ :preload, :setup ] do
9
+ require 'resque_sqs'
10
+
11
+ queues = (ENV['QUEUES'] || ENV['QUEUE']).to_s.split(',')
12
+
13
+ begin
14
+ worker = ResqueSqs::Worker.new(*queues)
15
+ if ENV['LOGGING'] || ENV['VERBOSE']
16
+ worker.verbose = ENV['LOGGING'] || ENV['VERBOSE']
17
+ end
18
+ if ENV['VVERBOSE']
19
+ worker.very_verbose = ENV['VVERBOSE']
20
+ end
21
+ worker.term_timeout = ENV['RESQUE_TERM_TIMEOUT'] || 4.0
22
+ worker.term_child = ENV['TERM_CHILD']
23
+ worker.run_at_exit_hooks = ENV['RUN_AT_EXIT_HOOKS']
24
+ rescue ResqueSqs::NoQueueError
25
+ abort "set QUEUE env var, e.g. $ QUEUE=critical,high rake resque_sqs:work"
26
+ end
27
+
28
+ if ENV['BACKGROUND']
29
+ unless Process.respond_to?('daemon')
30
+ abort "env var BACKGROUND is set, which requires ruby >= 1.9"
31
+ end
32
+ Process.daemon(true, true)
33
+ end
34
+
35
+ if ENV['PIDFILE']
36
+ File.open(ENV['PIDFILE'], 'w') { |f| f << worker.pid }
37
+ end
38
+
39
+ worker.log "Starting worker #{worker}"
40
+
41
+ worker.work(ENV['INTERVAL'] || 5) # interval, will block
42
+ end
43
+
44
+ desc "Start multiple Resque workers. Should only be used in dev mode."
45
+ task :workers do
46
+ threads = []
47
+
48
+ ENV['COUNT'].to_i.times do
49
+ threads << Thread.new do
50
+ system "rake resque_sqs:work"
51
+ end
52
+ end
53
+
54
+ threads.each { |thread| thread.join }
55
+ end
56
+
57
+ # Preload app files if this is Rails
58
+ task :preload => :setup do
59
+ if defined?(Rails) && Rails.respond_to?(:application)
60
+ # Rails 3
61
+ Rails.application.eager_load!
62
+ elsif defined?(Rails::Initializer)
63
+ # Rails 2.3
64
+ $rails_rake_task = false
65
+ Rails::Initializer.run :load_application_classes
66
+ end
67
+ end
68
+
69
+ namespace :failures do
70
+ desc "Sort the 'failed' queue for the redis_multi_queue failure backend"
71
+ task :sort do
72
+ require 'resque_sqs'
73
+ require 'resque_sqs/failure/redis'
74
+
75
+ warn "Sorting #{ResqueSqs::Failure.count} failures..."
76
+ ResqueSqs::Failure.each(0, ResqueSqs::Failure.count) do |_, failure|
77
+ data = ResqueSqs.encode(failure)
78
+ ResqueSqs.redis.rpush(ResqueSqs::Failure.failure_queue_name(failure['queue']), data)
79
+ end
80
+ warn "done!"
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,91 @@
1
+ require 'strscan'
2
+
3
+ module UTF8Util
4
+ HIGH_BIT_RANGE = /[\x80-\xff]/
5
+
6
+ # Check if this String is valid UTF-8
7
+ #
8
+ # Returns true or false.
9
+ def self.valid?(str)
10
+ sc = StringScanner.new(str)
11
+
12
+ while sc.skip_until(HIGH_BIT_RANGE)
13
+ sc.pos -= 1
14
+
15
+ if !sequence_length(sc)
16
+ return false
17
+ end
18
+ end
19
+
20
+ true
21
+ end
22
+
23
+ # Replace invalid UTF-8 character sequences with a replacement character
24
+ #
25
+ # Returns self as valid UTF-8.
26
+ def self.clean!(str)
27
+ sc = StringScanner.new(str)
28
+ while sc.skip_until(HIGH_BIT_RANGE)
29
+ pos = sc.pos = sc.pos-1
30
+
31
+ if !sequence_length(sc)
32
+ str[pos] = REPLACEMENT_CHAR
33
+ end
34
+ end
35
+
36
+ str
37
+ end
38
+
39
+ # Validate the UTF-8 sequence at the current scanner position.
40
+ #
41
+ # scanner - StringScanner instance so we can advance the pointer as we verify.
42
+ #
43
+ # Returns The length in bytes of this UTF-8 sequence, false if invalid.
44
+ def self.sequence_length(scanner)
45
+ leader = scanner.get_byte[0]
46
+
47
+ if (leader >> 5) == 0x6
48
+ if check_next_sequence(scanner)
49
+ return 2
50
+ else
51
+ scanner.pos -= 1
52
+ end
53
+ elsif (leader >> 4) == 0x0e
54
+ if check_next_sequence(scanner)
55
+ if check_next_sequence(scanner)
56
+ return 3
57
+ else
58
+ scanner.pos -= 2
59
+ end
60
+ else
61
+ scanner.pos -= 1
62
+ end
63
+ elsif (leader >> 3) == 0x1e
64
+ if check_next_sequence(scanner)
65
+ if check_next_sequence(scanner)
66
+ if check_next_sequence(scanner)
67
+ return 4
68
+ else
69
+ scanner.pos -= 3
70
+ end
71
+ else
72
+ scanner.pos -= 2
73
+ end
74
+ else
75
+ scanner.pos -= 1
76
+ end
77
+ end
78
+
79
+ false
80
+ end
81
+
82
+ private
83
+
84
+ # Read another byte off the scanner oving the scan position forward one place
85
+ #
86
+ # Returns nothing.
87
+ def self.check_next_sequence(scanner)
88
+ byte = scanner.get_byte[0]
89
+ (byte >> 6) == 0x2
90
+ end
91
+ end
@@ -0,0 +1,5 @@
1
+ module UTF8Util
2
+ def self.clean!(str)
3
+ str.force_encoding("binary").encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => REPLACEMENT_CHAR)
4
+ end
5
+ end
@@ -0,0 +1,20 @@
1
+ module UTF8Util
2
+ # use '?' intsead of the unicode replace char, since that is 3 bytes
3
+ # and can increase the string size if it's done a lot
4
+ REPLACEMENT_CHAR = "?"
5
+
6
+ # Replace invalid UTF-8 character sequences with a replacement character
7
+ #
8
+ # Returns self as valid UTF-8.
9
+ def self.clean!(str)
10
+ return str if str.encoding.to_s == "UTF-8"
11
+ str.force_encoding("binary").encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => REPLACEMENT_CHAR)
12
+ end
13
+
14
+ # Replace invalid UTF-8 character sequences with a replacement character
15
+ #
16
+ # Returns a copy of this String as valid UTF-8.
17
+ def self.clean(str)
18
+ clean!(str.dup)
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module ResqueSqs
2
+ Version = VERSION = '1.25.2'
3
+ end