delayed_job_active_record 4.0.0.beta2 → 4.0.0.beta3

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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjhkN2JjN2FiYWVkMTM0ZWRlMjA4NjBiZWE2NjZmYWM5YzNkZTJjZQ==
5
+ data.tar.gz: !binary |-
6
+ NDFiNDA5ZTQ5MTA3ZmU3NWJmMzkzMWFhNWU4MGZmMjM1MjJkOGRmMQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ N2FhMjcwZTBmMzkyNWEzMTg0MjhlMDY1NmExNzU2NGUyMjM2MzgzMDVjMTlk
10
+ MjIzMDE4YTQ3MWYwZjNjZmY4NDc2MzA1MzlmMzBkNTZjYmY0YzE3NzI1ZmY2
11
+ NjVmZjMwZDExNjdkNDhlNDYyMjE3ZmFhMThiODk4YjRlNDNjYTc=
12
+ data.tar.gz: !binary |-
13
+ YTdjMGVhMWM1MjM5OTE5NzI1ZmZiYjlkNjcxNTg2ODkzYzRlZWQ5ZWQ4Y2I2
14
+ MzE1NmNjZWY3NDdiM2JmYTc4Y2RkMDJkNmM3ZWI0NDJlMjU1MTUyNjA0YWI5
15
+ NGZkNGE3M2U5NGI1YWQ1MzA5ODMwYzAyODA5Y2RjZDQxODlkZTE=
data/Rakefile CHANGED
@@ -1,12 +1,35 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require 'rubygems'
3
- require 'bundler/setup'
2
+ require "bundler/gem_helper"
4
3
  Bundler::GemHelper.install_tasks
5
4
 
6
- require 'rspec/core/rake_task'
7
- desc 'Run the specs'
8
- RSpec::Core::RakeTask.new do |r|
9
- r.verbose = false
5
+ require "rspec/core/rake_task"
6
+
7
+ ADAPTERS = %w(mysql postgresql sqlite3)
8
+
9
+ ADAPTERS.each do |adapter|
10
+ desc "Run RSpec code examples for #{adapter} adapter"
11
+ RSpec::Core::RakeTask.new(adapter => "#{adapter}:adapter")
12
+
13
+ namespace adapter do
14
+ task :adapter do
15
+ ENV["ADAPTER"] = adapter
16
+ end
17
+ end
18
+ end
19
+
20
+ task :coverage do
21
+ ENV["COVERAGE"] = "true"
22
+ end
23
+
24
+ task :adapter do
25
+ ENV["ADAPTER"] = nil
26
+ end
27
+
28
+ Rake::Task[:spec].enhance do
29
+ require "simplecov"
30
+ require "coveralls"
31
+
32
+ Coveralls::SimpleCov::Formatter.new.format(SimpleCov.result)
10
33
  end
11
34
 
12
- task :default => :spec
35
+ task default: ([:coverage] + ADAPTERS + [:adapter])
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.add_dependency 'activerecord', ['>= 3.0', '< 4.1']
5
- spec.add_dependency 'delayed_job', '~> 4.0.0.beta1'
5
+ spec.add_dependency 'delayed_job', ['>= 3.0', '< 4.1']
6
6
  spec.authors = ["Brian Ryckbost", "Matt Griffin", "Erik Michaels-Ober"]
7
7
  spec.description = 'ActiveRecord backend for Delayed::Job, originally authored by Tobias Lütke'
8
8
  spec.email = ['bryckbost@gmail.com', 'matt@griffinonline.org', 'sferik@gmail.com']
@@ -15,5 +15,5 @@ Gem::Specification.new do |spec|
15
15
  spec.require_paths = ['lib']
16
16
  spec.summary = 'ActiveRecord backend for DelayedJob'
17
17
  spec.test_files = Dir.glob("spec/**/*")
18
- spec.version = '4.0.0.beta2'
18
+ spec.version = '4.0.0.beta3'
19
19
  end
@@ -7,6 +7,11 @@ module Delayed
7
7
  class Job < ::ActiveRecord::Base
8
8
  include Delayed::Backend::Base
9
9
 
10
+ if ::ActiveRecord::VERSION::MAJOR < 4 || defined?(::ActiveRecord::MassAssignmentSecurity)
11
+ attr_accessible :priority, :run_at, :queue, :payload_object,
12
+ :failed_at, :locked_at, :locked_by, :handler
13
+ end
14
+
10
15
  scope :by_priority, lambda { order('priority ASC, run_at ASC') }
11
16
 
12
17
  before_save :set_default_run_at
@@ -62,7 +67,18 @@ module Delayed
62
67
  # This works on MySQL and possibly some other DBs that support UPDATE...LIMIT. It uses separate queries to lock and return the job
63
68
  count = ready_scope.limit(1).update_all(:locked_at => now, :locked_by => worker.name)
64
69
  return nil if count == 0
65
- self.where(:locked_at => now, :locked_by => worker.name).first
70
+ self.where(:locked_at => now, :locked_by => worker.name, :failed_at => nil).first
71
+ when "MSSQL"
72
+ # The MSSQL driver doesn't generate a limit clause when update_all is called directly
73
+ subsubquery_sql = ready_scope.limit(1).to_sql
74
+ # select("id") doesn't generate a subquery, so force a subquery
75
+ subquery_sql = "SELECT id FROM (#{subsubquery_sql}) AS x"
76
+ quoted_table_name = self.connection.quote_table_name(self.table_name)
77
+ sql = ["UPDATE #{quoted_table_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery_sql})", now, worker.name]
78
+ count = self.connection.execute(sanitize_sql(sql))
79
+ return nil if count == 0
80
+ # MSSQL JDBC doesn't support OUTPUT INSERTED.* for returning a result set, so query locked row
81
+ self.where(:locked_at => now, :locked_by => worker.name, :failed_at => nil).first
66
82
  else
67
83
  # This is our old fashion, tried and true, but slower lookup
68
84
  ready_scope.limit(worker.read_ahead).detect do |job|
@@ -1,4 +1,5 @@
1
1
  require 'generators/delayed_job/delayed_job_generator'
2
+ require 'generators/delayed_job/next_migration_version'
2
3
  require 'rails/generators/migration'
3
4
  require 'rails/generators/active_record'
4
5
 
@@ -6,6 +7,7 @@ require 'rails/generators/active_record'
6
7
  module DelayedJob
7
8
  class ActiveRecordGenerator < ::DelayedJobGenerator
8
9
  include Rails::Generators::Migration
10
+ extend NextMigrationVersion
9
11
 
10
12
  self.source_paths << File.join(File.dirname(__FILE__), 'templates')
11
13
 
@@ -0,0 +1,14 @@
1
+ module DelayedJob
2
+ module NextMigrationVersion
3
+ # while methods have moved around this has been the implementation
4
+ # since ActiveRecord 3.0
5
+ def next_migration_number(dirname)
6
+ next_migration_number = current_migration_number(dirname) + 1
7
+ if ActiveRecord::Base.timestamped_migrations
8
+ [Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % next_migration_number].max
9
+ else
10
+ "%.3d" % next_migration_number
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,15 +1,15 @@
1
1
  class CreateDelayedJobs < ActiveRecord::Migration
2
2
  def self.up
3
3
  create_table :delayed_jobs, :force => true do |table|
4
- table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue
5
- table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually.
6
- table.text :handler # YAML-encoded string of the object that will do work
7
- table.text :last_error # reason for last failure (See Note below)
8
- table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
9
- table.datetime :locked_at # Set when a client is working on this object
10
- table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
11
- table.string :locked_by # Who is working on this object (if locked)
12
- table.string :queue # The name of the queue this job is in
4
+ table.integer :priority, :default => 0, :null => false # Allows some jobs to jump to the front of the queue
5
+ table.integer :attempts, :default => 0, :null => false # Provides for retries, but still fail eventually.
6
+ table.text :handler, :null => false # YAML-encoded string of the object that will do work
7
+ table.text :last_error # reason for last failure (See Note below)
8
+ table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
9
+ table.datetime :locked_at # Set when a client is working on this object
10
+ table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
11
+ table.string :locked_by # Who is working on this object (if locked)
12
+ table.string :queue # The name of the queue this job is in
13
13
  table.timestamps
14
14
  end
15
15
 
@@ -1,11 +1,12 @@
1
1
  require 'generators/delayed_job/delayed_job_generator'
2
+ require 'generators/delayed_job/next_migration_version'
2
3
  require 'rails/generators/migration'
3
- require 'rails/generators/active_record'
4
4
 
5
5
  # Extend the DelayedJobGenerator so that it creates an AR migration
6
6
  module DelayedJob
7
7
  class UpgradeGenerator < ::DelayedJobGenerator
8
8
  include Rails::Generators::Migration
9
+ extend NextMigrationVersion
9
10
 
10
11
  self.source_paths << File.join(File.dirname(__FILE__), 'templates')
11
12
 
@@ -43,6 +43,23 @@ describe Delayed::Backend::ActiveRecord::Job do
43
43
  end
44
44
  end
45
45
 
46
+ if ::ActiveRecord::VERSION::MAJOR < 4 || defined?(::ActiveRecord::MassAssignmentSecurity)
47
+ context "ActiveRecord::Base.send(:attr_accessible, nil)" do
48
+ before do
49
+ Delayed::Backend::ActiveRecord::Job.send(:attr_accessible, nil)
50
+ end
51
+
52
+ after do
53
+ Delayed::Backend::ActiveRecord::Job.send(:attr_accessible, *Delayed::Backend::ActiveRecord::Job.new.attributes.keys)
54
+ end
55
+
56
+ it "is still accessible" do
57
+ job = Delayed::Backend::ActiveRecord::Job.enqueue :payload_object => EnqueueJobMod.new
58
+ expect(Delayed::Backend::ActiveRecord::Job.find(job.id).handler).to_not be_blank
59
+ end
60
+ end
61
+ end
62
+
46
63
  context "ActiveRecord::Base.table_name_prefix" do
47
64
  it "when prefix is not set, use 'delayed_jobs' as table name" do
48
65
  ::ActiveRecord::Base.table_name_prefix = nil
@@ -10,14 +10,21 @@ SimpleCov.start
10
10
  require 'logger'
11
11
  require 'rspec'
12
12
 
13
+ begin
14
+ require 'protected_attributes'
15
+ rescue LoadError
16
+ end
13
17
  require 'delayed_job_active_record'
14
18
  require 'delayed/backend/shared_spec'
15
19
 
16
20
  Delayed::Worker.logger = Logger.new('/tmp/dj.log')
17
21
  ENV['RAILS_ENV'] = 'test'
18
22
 
23
+ db_adapter, gemfile = ENV["ADAPTER"], ENV["BUNDLE_GEMFILE"]
24
+ db_adapter ||= gemfile && gemfile[%r(gemfiles/(.*?)/)] && $1
25
+ db_adapter ||= 'sqlite3'
26
+
19
27
  config = YAML.load(File.read('spec/database.yml'))
20
- db_adapter = ENV['CI_DB_ADAPTER'] || 'sqlite3'
21
28
  ActiveRecord::Base.establish_connection config[db_adapter]
22
29
  ActiveRecord::Base.logger = Delayed::Worker.logger
23
30
  ActiveRecord::Migration.verbose = false
@@ -46,7 +53,11 @@ end
46
53
 
47
54
  # Purely useful for test cases...
48
55
  class Story < ActiveRecord::Base
49
- self.primary_key = :story_id
56
+ if ::ActiveRecord::VERSION::MAJOR < 4 && ActiveRecord::VERSION::MINOR < 2
57
+ set_primary_key :story_id
58
+ else
59
+ self.primary_key = :story_id
60
+ end
50
61
  def tell; text; end
51
62
  def whatever(n, _); tell*n; end
52
63
  default_scope { where(:scoped => true) }
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delayed_job_active_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.beta2
5
- prerelease: 6
4
+ version: 4.0.0.beta3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Brian Ryckbost
@@ -11,12 +10,20 @@ authors:
11
10
  autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2013-04-02 00:00:00.000000000 Z
13
+ date: 2013-05-28 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
16
+ prerelease: false
17
17
  name: activerecord
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '3.0'
23
+ - - <
24
+ - !ruby/object:Gem::Version
25
+ version: '4.1'
18
26
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
27
  requirements:
21
28
  - - ! '>='
22
29
  - !ruby/object:Gem::Version
@@ -25,9 +32,10 @@ dependencies:
25
32
  - !ruby/object:Gem::Version
26
33
  version: '4.1'
27
34
  type: :runtime
35
+ - !ruby/object:Gem::Dependency
28
36
  prerelease: false
37
+ name: delayed_job
29
38
  version_requirements: !ruby/object:Gem::Requirement
30
- none: false
31
39
  requirements:
32
40
  - - ! '>='
33
41
  - !ruby/object:Gem::Version
@@ -35,22 +43,15 @@ dependencies:
35
43
  - - <
36
44
  - !ruby/object:Gem::Version
37
45
  version: '4.1'
38
- - !ruby/object:Gem::Dependency
39
- name: delayed_job
40
46
  requirement: !ruby/object:Gem::Requirement
41
- none: false
42
47
  requirements:
43
- - - ~>
48
+ - - ! '>='
44
49
  - !ruby/object:Gem::Version
45
- version: 4.0.0.beta1
46
- type: :runtime
47
- prerelease: false
48
- version_requirements: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ~>
50
+ version: '3.0'
51
+ - - <
52
52
  - !ruby/object:Gem::Version
53
- version: 4.0.0.beta1
53
+ version: '4.1'
54
+ type: :runtime
54
55
  description: ActiveRecord backend for Delayed::Job, originally authored by Tobias
55
56
  Lütke
56
57
  email:
@@ -69,6 +70,7 @@ files:
69
70
  - lib/delayed/backend/active_record.rb
70
71
  - lib/delayed_job_active_record.rb
71
72
  - lib/generators/delayed_job/active_record_generator.rb
73
+ - lib/generators/delayed_job/next_migration_version.rb
72
74
  - lib/generators/delayed_job/templates/migration.rb
73
75
  - lib/generators/delayed_job/templates/upgrade_migration.rb
74
76
  - lib/generators/delayed_job/upgrade_generator.rb
@@ -79,30 +81,26 @@ files:
79
81
  homepage: http://github.com/collectiveidea/delayed_job_active_record
80
82
  licenses:
81
83
  - MIT
84
+ metadata: {}
82
85
  post_install_message:
83
86
  rdoc_options: []
84
87
  require_paths:
85
88
  - lib
86
89
  required_ruby_version: !ruby/object:Gem::Requirement
87
- none: false
88
90
  requirements:
89
91
  - - ! '>='
90
92
  - !ruby/object:Gem::Version
91
93
  version: '0'
92
- segments:
93
- - 0
94
- hash: 1966467636289984878
95
94
  required_rubygems_version: !ruby/object:Gem::Requirement
96
- none: false
97
95
  requirements:
98
96
  - - ! '>'
99
97
  - !ruby/object:Gem::Version
100
98
  version: 1.3.1
101
99
  requirements: []
102
100
  rubyforge_project:
103
- rubygems_version: 1.8.25
101
+ rubygems_version: 2.0.3
104
102
  signing_key:
105
- specification_version: 3
103
+ specification_version: 4
106
104
  summary: ActiveRecord backend for DelayedJob
107
105
  test_files:
108
106
  - spec/database.yml