aeternitas 0.2.0 → 2.0.0

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/lint.yml +25 -0
  4. data/.github/workflows/tests.yml +28 -0
  5. data/.gitignore +2 -5
  6. data/.ruby-version +1 -1
  7. data/CHANGELOG.md +36 -0
  8. data/CODE_OF_CONDUCT.md +0 -0
  9. data/Gemfile +1 -1
  10. data/LICENSE.txt +0 -0
  11. data/README.md +104 -145
  12. data/Rakefile +1 -1
  13. data/aeternitas.gemspec +23 -34
  14. data/lib/aeternitas/aeternitas_job.rb +7 -0
  15. data/lib/aeternitas/cleanup_old_metrics_job.rb +12 -0
  16. data/lib/aeternitas/cleanup_stale_locks_job.rb +12 -0
  17. data/lib/aeternitas/errors.rb +1 -2
  18. data/lib/aeternitas/guard.rb +76 -109
  19. data/lib/aeternitas/guard_lock.rb +19 -0
  20. data/lib/aeternitas/maintenance.rb +35 -0
  21. data/lib/aeternitas/metric.rb +12 -0
  22. data/lib/aeternitas/metrics.rb +54 -136
  23. data/lib/aeternitas/poll_job.rb +139 -0
  24. data/lib/aeternitas/pollable/configuration.rb +21 -22
  25. data/lib/aeternitas/pollable/dsl.rb +16 -17
  26. data/lib/aeternitas/pollable.rb +19 -18
  27. data/lib/aeternitas/pollable_meta_data.rb +18 -9
  28. data/lib/aeternitas/polling_frequency.rb +4 -4
  29. data/lib/aeternitas/source.rb +5 -5
  30. data/lib/aeternitas/storage_adapter/file.rb +9 -12
  31. data/lib/aeternitas/storage_adapter.rb +1 -3
  32. data/lib/aeternitas/test.rb +13 -0
  33. data/lib/aeternitas/unique_job_lock.rb +15 -0
  34. data/lib/aeternitas/version.rb +1 -1
  35. data/lib/aeternitas.rb +36 -26
  36. data/lib/generators/aeternitas/install_generator.rb +14 -8
  37. data/lib/generators/aeternitas/templates/add_aeternitas.rb.erb +34 -2
  38. data/lib/generators/aeternitas/templates/initializer.rb +10 -7
  39. metadata +39 -123
  40. data/.idea/.rakeTasks +0 -7
  41. data/.idea/misc.xml +0 -4
  42. data/.idea/modules.xml +0 -8
  43. data/.idea/vcs.xml +0 -6
  44. data/.rspec +0 -2
  45. data/.rubocop.yml +0 -2
  46. data/.travis.yml +0 -8
  47. data/lib/aeternitas/metrics/counter.rb +0 -18
  48. data/lib/aeternitas/metrics/ratio.rb +0 -67
  49. data/lib/aeternitas/metrics/ten_minutes_resolution.rb +0 -40
  50. data/lib/aeternitas/metrics/values.rb +0 -18
  51. data/lib/aeternitas/sidekiq/middleware.rb +0 -31
  52. data/lib/aeternitas/sidekiq/poll_job.rb +0 -30
  53. data/lib/aeternitas/sidekiq.rb +0 -5
  54. data/logo.png +0 -0
  55. data/logo.svg +0 -198
data/lib/aeternitas.rb CHANGED
@@ -1,8 +1,5 @@
1
+ require "ostruct"
1
2
  require "active_support/all"
2
- require "redis"
3
- require "connection_pool"
4
- require "sidekiq-unique-jobs"
5
- require "tabs_tabs"
6
3
  require "aeternitas/version"
7
4
  require "aeternitas/guard"
8
5
  require "aeternitas/pollable"
@@ -11,18 +8,19 @@ require "aeternitas/source"
11
8
  require "aeternitas/polling_frequency"
12
9
  require "aeternitas/errors"
13
10
  require "aeternitas/storage_adapter"
14
- require "aeternitas/sidekiq"
11
+ require "aeternitas/metric"
15
12
  require "aeternitas/metrics"
13
+ require "aeternitas/maintenance"
14
+ require "aeternitas/unique_job_lock"
15
+ require "aeternitas/guard_lock"
16
+ require "aeternitas/aeternitas_job"
17
+ require "aeternitas/poll_job"
18
+ require "aeternitas/cleanup_stale_locks_job"
19
+ require "aeternitas/cleanup_old_metrics_job"
20
+ require "aeternitas/test"
16
21
 
17
22
  # Aeternitas
18
23
  module Aeternitas
19
-
20
- # Get the configured redis connection
21
- # @return [ConnectionPool::Wrapper] returns a redis connection from the pool
22
- def self.redis
23
- @redis ||= ConnectionPool::Wrapper.new(size: 5, timeout: 3) { Redis.new(self.config.redis) }
24
- end
25
-
26
24
  # Access the configuration
27
25
  # @return [Aeternitas::Configuration] the Aeternitas configuration
28
26
  def self.config
@@ -33,36 +31,54 @@ module Aeternitas
33
31
  # @see Aeternitas::Configuration
34
32
  # @yieldparam [Aeternitas::Configuration] config the aeternitas configuration
35
33
  def self.configure
36
- yield(self.config)
34
+ yield(config)
35
+ end
36
+
37
+ # Returns true if aeternitas is in test mode.
38
+ # @return [Boolean]
39
+ def self.test_mode?
40
+ @test_mode == true
41
+ end
42
+
43
+ # Sets the test mode.
44
+ # @param [Boolean] value
45
+ def self.test_mode=(value)
46
+ @test_mode = value
37
47
  end
38
48
 
39
49
  # Enqueues all active pollables for which next polling is lower than the current time
40
50
  def self.enqueue_due_pollables
41
51
  Aeternitas::PollableMetaData.due.find_each do |pollable_meta_data|
42
- Aeternitas::Sidekiq::PollJob
52
+ Aeternitas::PollJob
43
53
  .set(queue: pollable_meta_data.pollable.pollable_configuration.queue)
44
- .perform_async(pollable_meta_data.id)
54
+ .perform_later(pollable_meta_data.id)
45
55
  pollable_meta_data.enqueue
46
56
  pollable_meta_data.save
47
57
  end
48
58
  end
49
59
 
50
60
  # Stores the global Aeternitas configuration
51
- # @!attribute [rw] redis
52
- # Redis configuration hash, Default: nil
53
61
  # @!attribute [rw] storage_adapter_config
54
62
  # Storage adapter configuration, See {Aeternitas::StorageAdapter} for configuration options
55
63
  # @!attribute [rw] storage_adapter
56
64
  # Storage adapter class. Default: {Aeternitas::StorageAdapter::File}
65
+ # @!attribute [rw] metrics_enabled
66
+ # Whether to log metrics to the database. Default: false
67
+ # @!attribute [rw] metric_retention_period
68
+ # How long to keep metric data before it can be cleaned up. Default: 90.days
57
69
  class Configuration
58
- attr_accessor :redis, :storage_adapter, :storage_adapter_config
70
+ attr_accessor :storage_adapter,
71
+ :storage_adapter_config,
72
+ :metrics_enabled,
73
+ :metric_retention_period
59
74
 
60
75
  def initialize
61
- @redis = nil
62
76
  @storage_adapter = Aeternitas::StorageAdapter::File
63
77
  @storage_adapter_config = {
64
- directory: defined?(Rails) ? File.join(Rails.root, %w[aeternitas_data]) : File.join(Dir.getwd, 'aeternitas_data')
78
+ directory: defined?(Rails) ? Rails.root.join("storage", "aeternitas") : File.join(Dir.getwd, "aeternitas_data")
65
79
  }
80
+ @metrics_enabled = false
81
+ @metric_retention_period = 90.days
66
82
  end
67
83
 
68
84
  # Creates a new StorageAdapter instance with the given options
@@ -70,11 +86,5 @@ module Aeternitas
70
86
  def get_storage_adapter
71
87
  @storage_adapter.new(storage_adapter_config)
72
88
  end
73
-
74
- def redis=(redis_config)
75
- @redis = redis_config
76
- TabsTabs.configure { |tabstabs_config| tabstabs_config.redis = redis_config }
77
- end
78
89
  end
79
90
  end
80
-
@@ -8,28 +8,34 @@ module Aeternitas
8
8
 
9
9
  source_root File.expand_path("../templates", __FILE__)
10
10
 
11
- desc 'Generates (but does not run) a migration to add all tables needed by Aeternitas.' \
12
- ' Also generates an initializer file for configuring Aeternitas'
11
+ desc "Generates (but does not run) a migration to add all tables needed by Aeternitas." \
12
+ " Also generates an initializer file for configuring Aeternitas"
13
13
 
14
14
  def create_migration_file
15
15
  migration_dir = File.expand_path("db/migrate")
16
- if self.class.migration_exists?(migration_dir, 'add_aeternitas')
17
- ::Kernel.warn "Migration already exists: #{template}"
16
+ if self.class.migration_exists?(migration_dir, "add_aeternitas")
17
+ ::Kernel.warn "Migration 'add_aeternitas' already exists. Skipping."
18
18
  else
19
- migration_template('add_aeternitas.rb.erb', 'db/migrate/add_aeternitas.rb')
19
+ migration_template("add_aeternitas.rb.erb", "db/migrate/add_aeternitas.rb")
20
20
  end
21
21
  end
22
22
 
23
23
  def copy_initializer
24
- copy_file('initializer.rb', 'config/initializers/aeternitas.rb')
24
+ copy_file("initializer.rb", "config/initializers/aeternitas.rb")
25
25
  end
26
26
 
27
27
  def reminder
28
- say "Don't forget to regularly run 'Aeternitas.enqueue_due_pollables'. E.g using 'whenever'", :red
28
+ say "\nDon't forget to regularly run 'Aeternitas.enqueue_due_pollables', e.g., using 'whenever'", :red
29
+ say "You should also schedule maintenance jobs:\n", :yellow
30
+ say "To clean up old metrics (if metrics are enabled):\n"
31
+ say " Aeternitas::CleanupOldMetricsJob.perform_later\n", :white
32
+ say "To clean up stale locks from crashed workers:\n"
33
+ say " Aeternitas::CleanupStaleLocksJob.perform_later\n", :white
34
+ say "Schedule these to run periodically, for example, once a week.\n"
29
35
  end
30
36
 
31
37
  def self.next_migration_number(dirname)
32
38
  ::ActiveRecord::Generators::Base.next_migration_number(dirname)
33
39
  end
34
40
  end
35
- end
41
+ end
@@ -1,11 +1,11 @@
1
1
  # This migration creates the tables needed by Aeternitas
2
- class AddAeternitas < ActiveRecord::Migration
2
+ class AddAeternitas < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
3
3
  def change
4
4
  create_table :aeternitas_pollable_meta_data do |t|
5
5
  t.string :pollable_type, null: false
6
6
  t.integer :pollable_id, null: false
7
7
  t.string :pollable_class, null: false
8
- t.datetime :next_polling, null: false, default: "1970-01-01 00:00:00+002"
8
+ t.datetime :next_polling, null: false, default: "1970-01-01 00:00:00"
9
9
  t.datetime :last_polling
10
10
  t.string :state
11
11
  t.text :deactivation_reason
@@ -21,5 +21,37 @@ class AddAeternitas < ActiveRecord::Migration
21
21
  t.datetime :created_at
22
22
  end
23
23
  add_index :aeternitas_sources, [:pollable_id, :pollable_type], name: 'aeternitas_pollable_source'
24
+
25
+ create_table :aeternitas_unique_job_locks do |t|
26
+ t.string :lock_digest, null: false
27
+ t.string :guard_key_digest
28
+ t.string :job_id
29
+ t.datetime :expires_at, null: false
30
+
31
+ t.timestamps
32
+ end
33
+ add_index :aeternitas_unique_job_locks, :lock_digest, unique: true
34
+ add_index :aeternitas_unique_job_locks, :guard_key_digest
35
+ add_index :aeternitas_unique_job_locks, :expires_at
36
+
37
+ create_table :aeternitas_guard_locks do |t|
38
+ t.string :lock_key, null: false
39
+ t.string :state, null: false
40
+ t.string :token, null: false, limit: 20
41
+ t.datetime :locked_until, null: false
42
+ t.text :reason
43
+
44
+ t.timestamps
45
+ end
46
+ add_index :aeternitas_guard_locks, :lock_key, unique: true
47
+ add_index :aeternitas_guard_locks, :locked_until
48
+
49
+ create_table :aeternitas_metrics do |t|
50
+ t.string :name, null: false
51
+ t.string :pollable_class, null: false
52
+ t.float :value, null: false
53
+ t.datetime :created_at, null: false
54
+ end
55
+ add_index :aeternitas_metrics, [:name, :pollable_class, :created_at], name: 'idx_aeternitas_metrics'
24
56
  end
25
57
  end
@@ -1,10 +1,13 @@
1
- # Configure Aeternitas
1
+ # Aeternitas is configured with sensible defaults. You can override them here if needed.
2
2
  Aeternitas.configure do |config|
3
- config.redis = { host: 'localhost', port: 6379 } #this is the default Redis config which should work in most cases.
4
- end
3
+ # Configure source storage (default is Rails.root.join("storage", "aeternitas"))
4
+ # config.storage_adapter_config = {
5
+ # directory: File.join(Rails.root, 'public', 'sources')
6
+ # }
7
+
8
+ # Configure metrics collection (default is disabled)
9
+ # config.metrics_enabled = true
5
10
 
6
- Sidekiq.configure_server do |config|
7
- config.server_middleware do |chain|
8
- chain.add Aeternitas::Sidekiq::Middleware
9
- end
11
+ # Change how long metric data is kept (default is 90 days)
12
+ # config.metric_retention_period = 180.days
10
13
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aeternitas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Prilop
8
8
  - Max Kießling
9
- - Robert Terbach
10
- autorequire:
9
+ - Louis Franzke
10
+ autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-07-08 00:00:00.000000000 Z
13
+ date: 2025-08-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -18,42 +18,28 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '5'
21
+ version: '7.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: '5'
28
+ version: '7.0'
29
29
  - !ruby/object:Gem::Dependency
30
- name: redis
30
+ name: activejob
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: '0'
36
- type: :runtime
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: '0'
43
- - !ruby/object:Gem::Dependency
44
- name: connection_pool
45
- requirement: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: '0'
35
+ version: '7.0'
50
36
  type: :runtime
51
37
  prerelease: false
52
38
  version_requirements: !ruby/object:Gem::Requirement
53
39
  requirements:
54
40
  - - ">="
55
41
  - !ruby/object:Gem::Version
56
- version: '0'
42
+ version: '7.0'
57
43
  - !ruby/object:Gem::Dependency
58
44
  name: aasm
59
45
  requirement: !ruby/object:Gem::Requirement
@@ -68,54 +54,6 @@ dependencies:
68
54
  - - ">="
69
55
  - !ruby/object:Gem::Version
70
56
  version: '0'
71
- - !ruby/object:Gem::Dependency
72
- name: sidekiq
73
- requirement: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - ">"
76
- - !ruby/object:Gem::Version
77
- version: '4'
78
- - - "<"
79
- - !ruby/object:Gem::Version
80
- version: '6'
81
- type: :runtime
82
- prerelease: false
83
- version_requirements: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - ">"
86
- - !ruby/object:Gem::Version
87
- version: '4'
88
- - - "<"
89
- - !ruby/object:Gem::Version
90
- version: '6'
91
- - !ruby/object:Gem::Dependency
92
- name: sidekiq-unique-jobs
93
- requirement: !ruby/object:Gem::Requirement
94
- requirements:
95
- - - "~>"
96
- - !ruby/object:Gem::Version
97
- version: '5.0'
98
- type: :runtime
99
- prerelease: false
100
- version_requirements: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - "~>"
103
- - !ruby/object:Gem::Version
104
- version: '5.0'
105
- - !ruby/object:Gem::Dependency
106
- name: tabstabs
107
- requirement: !ruby/object:Gem::Requirement
108
- requirements:
109
- - - ">="
110
- - !ruby/object:Gem::Version
111
- version: '0'
112
- type: :runtime
113
- prerelease: false
114
- version_requirements: !ruby/object:Gem::Requirement
115
- requirements:
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- version: '0'
119
57
  - !ruby/object:Gem::Dependency
120
58
  name: bundler
121
59
  requirement: !ruby/object:Gem::Requirement
@@ -145,63 +83,49 @@ dependencies:
145
83
  - !ruby/object:Gem::Version
146
84
  version: '0'
147
85
  - !ruby/object:Gem::Dependency
148
- name: rspec
86
+ name: rspec-rails
149
87
  requirement: !ruby/object:Gem::Requirement
150
88
  requirements:
151
89
  - - "~>"
152
90
  - !ruby/object:Gem::Version
153
- version: '3.0'
91
+ version: '7.0'
154
92
  type: :development
155
93
  prerelease: false
156
94
  version_requirements: !ruby/object:Gem::Requirement
157
95
  requirements:
158
96
  - - "~>"
159
97
  - !ruby/object:Gem::Version
160
- version: '3.0'
98
+ version: '7.0'
161
99
  - !ruby/object:Gem::Dependency
162
100
  name: sqlite3
163
101
  requirement: !ruby/object:Gem::Requirement
164
102
  requirements:
165
- - - ">="
103
+ - - "~>"
166
104
  - !ruby/object:Gem::Version
167
- version: '0'
105
+ version: '2.1'
168
106
  type: :development
169
107
  prerelease: false
170
108
  version_requirements: !ruby/object:Gem::Requirement
171
109
  requirements:
172
- - - ">="
110
+ - - "~>"
173
111
  - !ruby/object:Gem::Version
174
- version: '0'
112
+ version: '2.1'
175
113
  - !ruby/object:Gem::Dependency
176
114
  name: database_cleaner
177
115
  requirement: !ruby/object:Gem::Requirement
178
116
  requirements:
179
117
  - - "~>"
180
118
  - !ruby/object:Gem::Version
181
- version: '1.5'
119
+ version: '2.0'
182
120
  type: :development
183
121
  prerelease: false
184
122
  version_requirements: !ruby/object:Gem::Requirement
185
123
  requirements:
186
124
  - - "~>"
187
125
  - !ruby/object:Gem::Version
188
- version: '1.5'
189
- - !ruby/object:Gem::Dependency
190
- name: rspec-sidekiq
191
- requirement: !ruby/object:Gem::Requirement
192
- requirements:
193
- - - ">="
194
- - !ruby/object:Gem::Version
195
- version: '0'
196
- type: :development
197
- prerelease: false
198
- version_requirements: !ruby/object:Gem::Requirement
199
- requirements:
200
- - - ">="
201
- - !ruby/object:Gem::Version
202
- version: '0'
126
+ version: '2.0'
203
127
  - !ruby/object:Gem::Dependency
204
- name: mock_redis
128
+ name: standard
205
129
  requirement: !ruby/object:Gem::Requirement
206
130
  requirements:
207
131
  - - ">="
@@ -214,27 +138,19 @@ dependencies:
214
138
  - - ">="
215
139
  - !ruby/object:Gem::Version
216
140
  version: '0'
217
- description: |2
218
- Æternitas provides means to regularly 'poll' resources (i.e. a website, twitter feed or API) and to permanently
219
- store retrieved results. By default æternitas avoids putting too much load on external servers and stores raw
220
- results as compressed files on disk. It can be configured to a wide variety of polling strategies (e.g. frequencies,
221
- cooldown periods, ignoring exceptions, deactivating resources, ...)."
141
+ description: æternitas is a tool support polling resources (webpages, APIs).
222
142
  email:
223
- - max@kopfueber.org
224
- - michael.prilop@imw.fraunhofer.de
143
+ - prilop@infai.org
225
144
  executables: []
226
145
  extensions: []
227
146
  extra_rdoc_files: []
228
147
  files:
148
+ - ".gitattributes"
149
+ - ".github/workflows/lint.yml"
150
+ - ".github/workflows/tests.yml"
229
151
  - ".gitignore"
230
- - ".idea/.rakeTasks"
231
- - ".idea/misc.xml"
232
- - ".idea/modules.xml"
233
- - ".idea/vcs.xml"
234
- - ".rspec"
235
- - ".rubocop.yml"
236
152
  - ".ruby-version"
237
- - ".travis.yml"
153
+ - CHANGELOG.md
238
154
  - CODE_OF_CONDUCT.md
239
155
  - Gemfile
240
156
  - LICENSE.txt
@@ -244,35 +160,35 @@ files:
244
160
  - bin/console
245
161
  - bin/setup
246
162
  - lib/aeternitas.rb
163
+ - lib/aeternitas/aeternitas_job.rb
164
+ - lib/aeternitas/cleanup_old_metrics_job.rb
165
+ - lib/aeternitas/cleanup_stale_locks_job.rb
247
166
  - lib/aeternitas/errors.rb
248
167
  - lib/aeternitas/guard.rb
168
+ - lib/aeternitas/guard_lock.rb
169
+ - lib/aeternitas/maintenance.rb
170
+ - lib/aeternitas/metric.rb
249
171
  - lib/aeternitas/metrics.rb
250
- - lib/aeternitas/metrics/counter.rb
251
- - lib/aeternitas/metrics/ratio.rb
252
- - lib/aeternitas/metrics/ten_minutes_resolution.rb
253
- - lib/aeternitas/metrics/values.rb
172
+ - lib/aeternitas/poll_job.rb
254
173
  - lib/aeternitas/pollable.rb
255
174
  - lib/aeternitas/pollable/configuration.rb
256
175
  - lib/aeternitas/pollable/dsl.rb
257
176
  - lib/aeternitas/pollable_meta_data.rb
258
177
  - lib/aeternitas/polling_frequency.rb
259
- - lib/aeternitas/sidekiq.rb
260
- - lib/aeternitas/sidekiq/middleware.rb
261
- - lib/aeternitas/sidekiq/poll_job.rb
262
178
  - lib/aeternitas/source.rb
263
179
  - lib/aeternitas/storage_adapter.rb
264
180
  - lib/aeternitas/storage_adapter/file.rb
181
+ - lib/aeternitas/test.rb
182
+ - lib/aeternitas/unique_job_lock.rb
265
183
  - lib/aeternitas/version.rb
266
184
  - lib/generators/aeternitas/install_generator.rb
267
185
  - lib/generators/aeternitas/templates/add_aeternitas.rb.erb
268
186
  - lib/generators/aeternitas/templates/initializer.rb
269
- - logo.png
270
- - logo.svg
271
- homepage: https://github.com/FHG-IMW/aeternitas
187
+ homepage: https://github.com/Dietech-Group/aeternitas
272
188
  licenses:
273
189
  - MIT
274
190
  metadata: {}
275
- post_install_message:
191
+ post_install_message:
276
192
  rdoc_options: []
277
193
  require_paths:
278
194
  - lib
@@ -287,8 +203,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
287
203
  - !ruby/object:Gem::Version
288
204
  version: '0'
289
205
  requirements: []
290
- rubygems_version: 3.0.6
291
- signing_key:
206
+ rubygems_version: 3.4.19
207
+ signing_key:
292
208
  specification_version: 4
293
- summary: æternitas - A ruby gem for continuous source retrieval and data integration
209
+ summary: æternitas - version 2
294
210
  test_files: []
data/.idea/.rakeTasks DELETED
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Settings><!--This file was automatically generated by Ruby plugin.
3
- You are allowed to:
4
- 1. Remove rake task
5
- 2. Add existing rake tasks
6
- To add existing rake tasks automatically delete this file and reload the project.
7
- --><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build aeternitas-0.1.0.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install aeternitas-0.1.0.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install aeternitas-0.1.0.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Create tag v0.1.0 and build and push aeternitas-0.1.0.gem to Rubygems" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
data/.idea/misc.xml DELETED
@@ -1,4 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectRootManager" version="2" project-jdk-name="rbenv: 2.4.0" project-jdk-type="RUBY_SDK" />
4
- </project>
data/.idea/modules.xml DELETED
@@ -1,8 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="ProjectModuleManager">
4
- <modules>
5
- <module fileurl="file://$PROJECT_DIR$/.idea/aeternitas.iml" filepath="$PROJECT_DIR$/.idea/aeternitas.iml" />
6
- </modules>
7
- </component>
8
- </project>
data/.idea/vcs.xml DELETED
@@ -1,6 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project version="4">
3
- <component name="VcsDirectoryMappings">
4
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
- </component>
6
- </project>
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --format documentation
2
- --color
data/.rubocop.yml DELETED
@@ -1,2 +0,0 @@
1
- Metrics/LineLength:
2
- Max: 100
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- sudo: false
2
- services:
3
- - redis-server
4
- language: ruby
5
- rvm:
6
- - 2.4.0
7
- - 2.5.7
8
- before_install: gem install bundler -v 1.13.7
@@ -1,18 +0,0 @@
1
- module Aeternitas
2
- module Metrics
3
- # Wrapper for {TabsTabs::Metrics::Counter::Stats}.
4
- # It is for Counter metrics.
5
- class Counter
6
- include Enumerable
7
- extend Forwardable
8
-
9
- def_delegators :@tabstabs_stats, :min, :max, :avg, :each, :to_a, :first, :last
10
-
11
- # Create a new Wrapper
12
- # @param [TabsTabs::Metrics::Counter::Stats] tabstabs_stats the wrapped stats.
13
- def initialize(tabstabs_stats)
14
- @tabstabs_stats = tabstabs_stats
15
- end
16
- end
17
- end
18
- end
@@ -1,67 +0,0 @@
1
- module Aeternitas
2
- module Metrics
3
- # Stores time series data for ratios
4
- # @!attribute [r] from
5
- # @return [DateTime] start of the time series
6
- # @!attribute [r] to
7
- # @return [DateTime] end of the time series
8
- # @!attribute [r] resolution
9
- # @return [Symbol] resolution of the time series
10
- # @!attribute [r] values
11
- # @return [Array] time series data
12
- # The time series values have the following format:
13
- # {
14
- # timestamp: DateTime("2000-01-01 00:00:00 UTC"),
15
- # ratio: 0.01
16
- # }
17
- class Ratio
18
- include Enumerable
19
-
20
- attr_reader :from, :to, :resolution, :values
21
-
22
- # Create a new ratio time series
23
- # @param [DateTime] from start of the time series
24
- # @param [DateTime] to end of the time series
25
- # @param [Symbol] resolution time series resolution
26
- # @param [Array] values time series data
27
- def initialize(from, to, resolution, values)
28
- @from = from
29
- @to = to
30
- @resolution = resolution
31
- @values = values
32
- end
33
-
34
- def each(&block)
35
- @values.each(&block)
36
- end
37
-
38
- def to_a
39
- @values.to_a
40
- end
41
-
42
- # Computes the minimum ration within the time series.
43
- # @return [Float] the minimum ratio
44
- def min
45
- @values.min_by { |v| v['ratio'] }['ratio']
46
- end
47
-
48
- # Computes the maximum ration within the time series.
49
- # @return [Float] the maximum ratio
50
- def max
51
- @values.max_by { |v| v['ratio'] }['ratio']
52
- end
53
-
54
- # Computes the average ration within the time series.
55
- # @return [Float] the average ratio
56
- def avg
57
- return 0 if count.zero?
58
- p @values
59
- @values.inject(0) { |sum, v| sum + v[:ratio] } / @values.count
60
- end
61
-
62
- def to_s
63
- values.to_s
64
- end
65
- end
66
- end
67
- end