activejob-status 0.1.5 → 0.2.2

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: d2c2f5a9c1c18e978423df936f1df40e5ac10e97ec28782260fb3980edac85a8
4
- data.tar.gz: f77a7dabc7c43e311af942ddb0218b9f044ebee1284190a37eb810e49da462c2
3
+ metadata.gz: 8f631add9a816c630d494258c0c62b8357f04d6cf1dcb4c8681646f294b1af1e
4
+ data.tar.gz: 1bf02e33cfc7ae8e5ffddfd72466efd181d241cab6cfa1a07b75094fd241c18c
5
5
  SHA512:
6
- metadata.gz: 2db433d26e44683e749a86b8dae4ea426e002d2f3ef3c06aa36a731e75fb2ec7255ec81b36f4daa8c476326f4e45834c180b6d13c600ecd511a05bba800f23dc
7
- data.tar.gz: 0a36fb9aa42f326a9d63c203f8c263c69b11f2d92ab438eaf59072aac20c994c655b6125c0d52496fedf9588d44135bcc4c12dbeef2e39f42246d43288de64eb
6
+ metadata.gz: 71af5a019d4004e27400abc14ee1b3d5c83a794d86096f0dd821a5f8fd52782b303beaac6b31533b6b50e74e44c2254d7e9bbed52d3439556f79aff6fa349ad9
7
+ data.tar.gz: b5ab17ba47d02f4a0493fc92b34684b261c1720da1da18627a050a7746129febdbcc30e750970d356948b738ab306a4fc8cecb2ca7dc35ccbf1a9c477a46dea8
@@ -1,45 +1,49 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveJob
2
4
  module Status
3
5
  class Progress
4
- delegate :[], :to_s, :to_json, :inspect, to: :hash
6
+ attr_reader :job, :total, :progress
7
+
8
+ delegate :[], :to_s, :to_json, :inspect, to: :to_h
9
+ delegate :status, to: :job, prefix: true
5
10
 
6
11
  def initialize(job)
7
- @job = job
8
- @total = 100
12
+ @job = job
13
+ @total = 100
9
14
  @progress = 0
10
15
  end
11
16
 
12
17
  def total=(num)
13
18
  @total = num
14
- update
19
+ job_status.update(to_h, force: true)
15
20
  end
16
21
 
17
22
  def progress=(num)
18
- update { num }
23
+ @progress = num
24
+ job_status.update(to_h, force: true)
19
25
  end
20
26
 
21
27
  def increment(num = 1)
22
- update { @progress + num }
28
+ @progress += num
29
+ job_status.update(to_h)
30
+ self
23
31
  end
24
32
 
25
33
  def decrement(num = 1)
26
- update { @progress - num }
34
+ @progress -= num
35
+ job_status.update(to_h)
36
+ self
27
37
  end
28
38
 
29
39
  def finish
30
- update { @total }
31
- end
32
-
33
- private
34
-
35
- def update
36
- @progress = yield if block_given?
37
- @job.status.update(hash)
40
+ @progress = @total
41
+ job_status.update(to_h, force: true)
38
42
  self
39
43
  end
40
44
 
41
- def hash
42
- { progress: @progress, total: @total }
45
+ def to_h
46
+ {progress: @progress, total: @total}
43
47
  end
44
48
  end
45
49
  end
@@ -1,31 +1,39 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveJob
2
4
  module Status
3
5
  class Status
4
6
  delegate :[], :to_s, :to_json, :inspect, to: :read
5
7
  delegate :queued?, :working?, :completed?, :failed?, to: :status_inquiry
6
8
 
7
- def initialize(job)
9
+ def initialize(job, options = {})
10
+ options = ActiveJob::Status.options.merge(options)
11
+ @storage = ActiveJob::Status::Storage.new(options)
8
12
  @job = job
9
13
  end
10
14
 
11
15
  def []=(key, value)
12
- update(key => value)
16
+ update({key => value}, force: true)
13
17
  end
14
18
 
15
19
  def read
16
- Storage.read(@job)
20
+ @storage.read(@job)
17
21
  end
22
+ alias_method :to_h, :read
23
+
24
+ def update(message, options = {})
25
+ @job.progress.instance_variable_set(:@progress, message[:progress]) if message.include?(:progress)
26
+ @job.progress.instance_variable_set(:@total, message[:total]) if message.include?(:total)
18
27
 
19
- def update(message)
20
- Storage.update(@job, message)
28
+ @storage.update(@job, message, **options)
21
29
  end
22
30
 
23
31
  def delete
24
- Storage.delete(@job)
32
+ @storage.delete(@job)
25
33
  end
26
34
 
27
35
  def job_id
28
- Storage.job_id(@job)
36
+ @storage.job_id(@job)
29
37
  end
30
38
 
31
39
  def status
@@ -1,39 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveJob
2
4
  module Status
3
- module Storage
4
- class << self
5
- def store
6
- ActiveJob::Status.store
7
- end
5
+ class Storage
6
+ def initialize(options = {})
7
+ options.assert_valid_keys(:expires_in, :throttle_interval)
8
8
 
9
- def options
10
- ActiveJob::Status.options
11
- end
9
+ @expires_in = options[:expires_in]
10
+ @throttle = ActiveJob::Status::Throttle.new(options[:throttle_interval])
11
+ end
12
12
 
13
- def job_id(job)
14
- job.is_a?(String) ? job : job.job_id
15
- end
13
+ def store
14
+ @store ||= ActiveJob::Status.store
15
+ end
16
16
 
17
- def key(job)
18
- "activejob:status:#{job_id(job)}"
19
- end
17
+ def job_id(job)
18
+ job.is_a?(String) ? job : job.job_id
19
+ end
20
20
 
21
- def read(job)
22
- store.read(key(job)) || {}
23
- end
21
+ def key(job)
22
+ "activejob:status:#{job_id(job)}"
23
+ end
24
24
 
25
- def write(job, message)
26
- store.write(key(job), message, expires_in: options[:expires_in])
27
- end
25
+ def read(job)
26
+ store.read(key(job)) || {}
27
+ end
28
28
 
29
- def update(job, message)
30
- write(job, read(job).merge(message))
29
+ def write(job, message, force: false)
30
+ @throttle.wrap(force: force) do
31
+ store.write(key(job), message, expires_in: @expires_in)
31
32
  end
33
+ end
32
34
 
33
- def delete(job)
34
- store.delete(key(job))
35
+ def update(job, message, force: false)
36
+ @throttle.wrap(force: force) do
37
+ message = read(job).merge(message)
38
+ store.write(key(job), message, expires_in: @expires_in)
35
39
  end
36
40
  end
41
+
42
+ def delete(job)
43
+ store.delete(key(job))
44
+ end
37
45
  end
38
46
  end
39
47
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveJob
4
+ module Status
5
+ class Throttle
6
+ def initialize(interval)
7
+ @interval = interval
8
+ @started_at = Time.current
9
+ end
10
+
11
+ def wrap(force: false)
12
+ return yield if force || @interval.nil? || @interval.zero?
13
+
14
+ now = Time.current
15
+ elasped = now - @started_at
16
+ return if @interval > elasped
17
+
18
+ yield
19
+ @started_at = now
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveJob
2
4
  module Status
3
- VERSION = '0.1.5'.freeze
5
+ VERSION = "0.2.2"
4
6
  end
5
7
  end
@@ -1,19 +1,28 @@
1
- require 'activejob-status/storage'
2
- require 'activejob-status/status'
3
- require 'activejob-status/progress'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+ require "active_support/core_ext/hash"
5
+ require "activejob-status/storage"
6
+ require "activejob-status/status"
7
+ require "activejob-status/progress"
8
+ require "activejob-status/throttle"
4
9
 
5
10
  module ActiveJob
6
11
  module Status
7
12
  extend ActiveSupport::Concern
8
- DEFAULT_EXPIRY = 60 * 30
13
+
14
+ DEFAULT_OPTIONS = {
15
+ expires_in: 60 * 30,
16
+ throttle_interval: 0
17
+ }.freeze
9
18
 
10
19
  included do
11
- before_enqueue { |job| job.status.update(status: :queued) }
12
- before_perform { |job| job.status.update(status: :working) }
13
- after_perform { |job| job.status.update(status: :completed) }
20
+ before_enqueue { |job| job.status[:status] = :queued }
21
+ before_perform { |job| job.status[:status] = :working }
22
+ after_perform { |job| job.status[:status] = :completed }
14
23
 
15
24
  rescue_from(Exception) do |e|
16
- status.update(status: :failed)
25
+ status[:status] = :failed
17
26
  raise e
18
27
  end
19
28
  end
@@ -28,15 +37,16 @@ module ActiveJob
28
37
 
29
38
  class << self
30
39
  def options=(options)
31
- @@options = options
40
+ options.assert_valid_keys(*DEFAULT_OPTIONS.keys)
41
+ @@options = DEFAULT_OPTIONS.merge(options)
32
42
  end
33
43
 
34
44
  def options
35
- @@options ||= { expires_in: DEFAULT_EXPIRY }
45
+ @@options ||= DEFAULT_OPTIONS
36
46
  end
37
47
 
38
48
  def store=(store)
39
- store = ActiveSupport::Cache.lookup_store(store) if store.is_a?(Symbol)
49
+ store = ActiveSupport::Cache.lookup_store(*store) if store.is_a?(Array) || store.is_a?(Symbol)
40
50
  @@store = store
41
51
  end
42
52
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activejob-status
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Savater Sebastien
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-28 00:00:00.000000000 Z
11
+ date: 2021-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -38,7 +38,119 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.2'
41
- description:
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '13.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '1.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '1.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '1.20'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '1.20'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop-performance
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '1.11'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '1.11'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '2.4'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '2.4'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: standard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 1.3.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 1.3.0
153
+ description:
42
154
  email:
43
155
  - savater.sebastien@gmail.com
44
156
  executables: []
@@ -49,12 +161,13 @@ files:
49
161
  - lib/activejob-status/progress.rb
50
162
  - lib/activejob-status/status.rb
51
163
  - lib/activejob-status/storage.rb
164
+ - lib/activejob-status/throttle.rb
52
165
  - lib/activejob-status/version.rb
53
166
  homepage: https://github.com/inkstak/activejob-status
54
167
  licenses:
55
168
  - MIT
56
169
  metadata: {}
57
- post_install_message:
170
+ post_install_message:
58
171
  rdoc_options: []
59
172
  require_paths:
60
173
  - lib
@@ -69,9 +182,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
182
  - !ruby/object:Gem::Version
70
183
  version: '0'
71
184
  requirements: []
72
- rubyforge_project:
73
- rubygems_version: 2.7.7
74
- signing_key:
185
+ rubygems_version: 3.1.4
186
+ signing_key:
75
187
  specification_version: 4
76
188
  summary: Monitor your jobs
77
189
  test_files: []