job-iteration 0.9.8 → 1.0.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
  SHA256:
3
- metadata.gz: 491bb815da57f76483532694ef9ae646650fb7aceba6f6ec13e9cdcf7b1fa45d
4
- data.tar.gz: 122091085c03c51c798a6f6524ac21a225bff29025e538a34c1cff42eb891128
3
+ metadata.gz: 6d2d963a3239101fbb564b9864936a7f06413aead04540979b8d3737c7fc1429
4
+ data.tar.gz: e8b7e4d4d75f263633883d6b24b1af0adfe549b0d8778d2fb57aeb937a482c03
5
5
  SHA512:
6
- metadata.gz: 190b96aeb121423cb7e0ec13c212804aa14164ac8a37a8641a96d2621185d42e4aa0898d116cd284ff8f4d839652bb248d58369abbe733d518f62350dfc0af6d
7
- data.tar.gz: 2efbc27bd9fcf6ca8b189febc0c5d1151e93430b9cdf60b2df5a3bd9fe0270e1f75f80296decf695143dc7a4881c0c47d6da36bdd161c8b6387bb8014a531ae1
6
+ metadata.gz: d3140b3feff8927f989a1ac2ad9c118254793e23119aabe56c405e6a35d0bd944ea176f3398e07fd5e1f0f3f43a7eac053bcf4565dfcc23341c1c26a67e58044
7
+ data.tar.gz: 4b71e936e4801192f62e1990761dcd544425d5fdffb7020bcabe9f0d91778c50b599d14f341ce04b8491797dff774b02ee26db8ff6dbc8ed1f1a2f0b42d2aa56
data/.gitignore CHANGED
@@ -8,3 +8,5 @@
8
8
  /tmp/
9
9
  .ruby-version
10
10
  .rubocop-http---shopify-github-io-ruby-style-guide-rubocop-yml
11
+ gemfiles/*.lock
12
+ Gemfile.lock
@@ -3,10 +3,9 @@ services:
3
3
  - redis-server
4
4
  language: ruby
5
5
  rvm:
6
- - 2.4.5
7
- - 2.5.3
6
+ - 2.5.5
7
+ - 2.6.2
8
8
  before_install:
9
- - gem install bundler
10
9
  - mysql -e 'CREATE DATABASE job_iteration_test;'
11
10
  script:
12
11
  - bundle exec rake test
@@ -14,5 +13,5 @@ script:
14
13
  - bundle exec yardoc --no-output --no-save --no-stats --fail-on-warning
15
14
 
16
15
  gemfile:
17
- - 'gemfiles/activejob_5_2.gemfile'
18
- - 'gemfiles/activejob_edge.gemfile'
16
+ - 'gemfiles/rails_5_2.gemfile'
17
+ - 'gemfiles/rails_edge.gemfile'
@@ -4,6 +4,18 @@
4
4
 
5
5
  #### Bug fix
6
6
 
7
+ ### v1.0.0 (April 29, 2019)
8
+
9
+ It’s been in production at Shopify since 2017. It has support for Rails 5 and 6 :tada:
10
+
11
+ ### Deprecations
12
+
13
+ - [34](https://github.com/Shopify/job-iteration/pull/34) - remove supports_interruption?
14
+
15
+ ### Internal
16
+
17
+ - [30](https://github.com/Shopify/job-iteration/pull/30) - Better #each_iteration argument names
18
+
7
19
  ### v0.9.8 (December 5, 2018)
8
20
 
9
21
  #### Bug fix
data/Gemfile CHANGED
@@ -22,3 +22,4 @@ gem 'mocha'
22
22
 
23
23
  gem 'rubocop'
24
24
  gem 'yard'
25
+ gem 'rake'
data/README.md CHANGED
@@ -195,4 +195,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
195
195
 
196
196
  ## Code of Conduct
197
197
 
198
- Everyone interacting in the Job::Iteration project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/kirs/job-iteration/blob/master/CODE_OF_CONDUCT.md).
198
+ Everyone interacting in the Job::Iteration project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/Shopify/job-iteration/blob/master/CODE_OF_CONDUCT.md).
data/dev.yml CHANGED
@@ -7,7 +7,7 @@ up:
7
7
  - mysql-client:
8
8
  or: [mysql@5.7]
9
9
  - ruby:
10
- version: 2.5.3
10
+ version: 2.6.2
11
11
  - railgun
12
12
  - bundler
13
13
  - custom:
@@ -3,3 +3,4 @@
3
3
  eval_gemfile '../Gemfile'
4
4
 
5
5
  gem 'activejob', '~> 5.2.0'
6
+ gem 'activerecord', '~> 5.2.0'
@@ -25,9 +25,4 @@ Gem::Specification.new do |spec|
25
25
  spec.metadata["changelog_uri"] = "https://github.com/Shopify/job-iteration/blob/master/CHANGELOG.md"
26
26
 
27
27
  spec.add_dependency("activejob", ">= 5.2")
28
-
29
- spec.add_development_dependency("bundler", "~> 1.16")
30
- spec.add_development_dependency("rake", "~> 10.0")
31
- spec.add_development_dependency("minitest", "~> 5.0")
32
- spec.add_development_dependency("activerecord")
33
28
  end
@@ -4,6 +4,8 @@ module JobIteration
4
4
  # Builds Enumerator based on ActiveRecord Relation. Supports enumerating on rows and batches.
5
5
  # @see EnumeratorBuilder
6
6
  class ActiveRecordEnumerator
7
+ SQL_DATETIME_WITH_NSEC = "%Y-%m-%d %H:%M:%S.%N"
8
+
7
9
  def initialize(relation, columns: nil, batch_size: 100, cursor: nil)
8
10
  @relation = relation
9
11
  @batch_size = batch_size
@@ -24,7 +26,7 @@ module JobIteration
24
26
  def batches
25
27
  cursor = finder_cursor
26
28
  Enumerator.new(method(:size)) do |yielder|
27
- while records = cursor.next_batch(@batch_size)
29
+ while (records = cursor.next_batch(@batch_size))
28
30
  yielder.yield(records, cursor_value(records.last)) if records.any?
29
31
  end
30
32
  end
@@ -38,9 +40,8 @@ module JobIteration
38
40
 
39
41
  def cursor_value(record)
40
42
  positions = @columns.map do |column|
41
- method = column.to_s.split('.').last
42
- attribute = record.read_attribute(method.to_sym)
43
- attribute.is_a?(Time) ? attribute.to_s(:db) : attribute
43
+ attribute_name = column.to_s.split('.').last
44
+ column_value(record, attribute_name)
44
45
  end
45
46
  return positions.first if positions.size == 1
46
47
  positions
@@ -49,5 +50,15 @@ module JobIteration
49
50
  def finder_cursor
50
51
  JobIteration::ActiveRecordCursor.new(@relation, @columns, @cursor)
51
52
  end
53
+
54
+ def column_value(record, attribute)
55
+ value = record.read_attribute(attribute.to_sym)
56
+ case record.class.columns_hash.fetch(attribute).type
57
+ when :datetime
58
+ value.strftime(SQL_DATETIME_WITH_NSEC)
59
+ else
60
+ value
61
+ end
62
+ end
52
63
  end
53
64
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require_relative "./active_record_enumerator"
3
3
  require_relative "./csv_enumerator"
4
+ require "forwardable"
4
5
 
5
6
  module JobIteration
6
7
  class EnumeratorBuilder
@@ -36,10 +36,6 @@ module JobIteration
36
36
  set_callback(:complete, :after, *filters, &blk)
37
37
  end
38
38
 
39
- def supports_interruption?
40
- true
41
- end
42
-
43
39
  private
44
40
 
45
41
  def ban_perform_definition
@@ -73,7 +69,7 @@ module JobIteration
73
69
  end
74
70
 
75
71
  def retry_job(*)
76
- super unless @retried
72
+ super unless defined?(@retried) && @retried
77
73
  @retried = true
78
74
  end
79
75
 
@@ -121,9 +117,9 @@ module JobIteration
121
117
 
122
118
  def iterate_with_enumerator(enumerator, arguments)
123
119
  arguments = arguments.dup.freeze
124
- enumerator.each do |iteration, index|
120
+ enumerator.each do |object_from_enumerator, index|
125
121
  record_unit_of_work do
126
- each_iteration(iteration, *arguments)
122
+ each_iteration(object_from_enumerator, *arguments)
127
123
  self.cursor_position = index
128
124
  end
129
125
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JobIteration
4
- VERSION = "0.9.8"
4
+ VERSION = "1.0.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: job-iteration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.8
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-12-05 00:00:00.000000000 Z
11
+ date: 2019-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -24,62 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '5.2'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.16'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.16'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '10.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '10.0'
55
- - !ruby/object:Gem::Dependency
56
- name: minitest
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '5.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '5.0'
69
- - !ruby/object:Gem::Dependency
70
- name: activerecord
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
27
  description: Makes your background jobs interruptible and resumable.
84
28
  email:
85
29
  - ops-accounts+shipit@shopify.com
@@ -94,14 +38,13 @@ files:
94
38
  - CHANGELOG.md
95
39
  - CODE_OF_CONDUCT.md
96
40
  - Gemfile
97
- - Gemfile.lock
98
41
  - LICENSE.txt
99
42
  - README.md
100
43
  - Rakefile
101
44
  - bin/setup
102
45
  - dev.yml
103
- - gemfiles/activejob_5_2.gemfile
104
- - gemfiles/activejob_edge.gemfile
46
+ - gemfiles/rails_5_2.gemfile
47
+ - gemfiles/rails_edge.gemfile
105
48
  - guides/best-practices.md
106
49
  - guides/custom-enumerator.md
107
50
  - guides/iteration-how-it-works.md
@@ -1,115 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- job-iteration (0.9.8)
5
- activejob (>= 5.2)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- activejob (5.2.0)
11
- activesupport (= 5.2.0)
12
- globalid (>= 0.3.6)
13
- activemodel (5.2.0)
14
- activesupport (= 5.2.0)
15
- activerecord (5.2.0)
16
- activemodel (= 5.2.0)
17
- activesupport (= 5.2.0)
18
- arel (>= 9.0)
19
- activesupport (5.2.0)
20
- concurrent-ruby (~> 1.0, >= 1.0.2)
21
- i18n (>= 0.7, < 2)
22
- minitest (~> 5.1)
23
- tzinfo (~> 1.1)
24
- arel (9.0.0)
25
- ast (2.4.0)
26
- coderay (1.1.2)
27
- concurrent-ruby (1.0.5)
28
- connection_pool (2.2.2)
29
- database_cleaner (1.7.0)
30
- globalid (0.4.1)
31
- activesupport (>= 4.2.0)
32
- i18n (1.0.1)
33
- concurrent-ruby (~> 1.0)
34
- jaro_winkler (1.5.1)
35
- metaclass (0.0.4)
36
- method_source (0.9.0)
37
- minitest (5.11.3)
38
- mocha (1.5.0)
39
- metaclass (~> 0.0.1)
40
- mono_logger (1.1.0)
41
- multi_json (1.13.1)
42
- mustermann (1.0.2)
43
- mysql2 (0.4.10)
44
- parallel (1.12.1)
45
- parser (2.5.1.0)
46
- ast (~> 2.4.0)
47
- powerpack (0.1.2)
48
- pry (0.11.3)
49
- coderay (~> 1.1.0)
50
- method_source (~> 0.9.0)
51
- rack (2.0.5)
52
- rack-protection (2.0.3)
53
- rack
54
- rainbow (3.0.0)
55
- rake (10.5.0)
56
- redis (4.0.1)
57
- redis-namespace (1.6.0)
58
- redis (>= 3.0.4)
59
- resque (1.27.4)
60
- mono_logger (~> 1.0)
61
- multi_json (~> 1.0)
62
- redis-namespace (~> 1.3)
63
- sinatra (>= 0.9.2)
64
- vegas (~> 0.1.2)
65
- rubocop (0.57.2)
66
- jaro_winkler (~> 1.5.1)
67
- parallel (~> 1.10)
68
- parser (>= 2.5)
69
- powerpack (~> 0.1)
70
- rainbow (>= 2.2.2, < 4.0)
71
- ruby-progressbar (~> 1.7)
72
- unicode-display_width (~> 1.0, >= 1.0.1)
73
- ruby-progressbar (1.9.0)
74
- sidekiq (5.1.3)
75
- concurrent-ruby (~> 1.0)
76
- connection_pool (~> 2.2, >= 2.2.0)
77
- rack-protection (>= 1.5.0)
78
- redis (>= 3.3.5, < 5)
79
- sinatra (2.0.3)
80
- mustermann (~> 1.0)
81
- rack (~> 2.0)
82
- rack-protection (= 2.0.3)
83
- tilt (~> 2.0)
84
- thread_safe (0.3.6)
85
- tilt (2.0.8)
86
- tzinfo (1.2.5)
87
- thread_safe (~> 0.1)
88
- unicode-display_width (1.4.0)
89
- vegas (0.1.11)
90
- rack (>= 1.0.0)
91
- yard (0.9.15)
92
-
93
- PLATFORMS
94
- ruby
95
-
96
- DEPENDENCIES
97
- activerecord
98
- bundler (~> 1.16)
99
- database_cleaner
100
- globalid
101
- i18n
102
- job-iteration!
103
- minitest (~> 5.0)
104
- mocha
105
- mysql2 (~> 0.4.4)
106
- pry
107
- rake (~> 10.0)
108
- redis
109
- resque
110
- rubocop
111
- sidekiq
112
- yard
113
-
114
- BUNDLED WITH
115
- 1.17.1