frankenstein 0.3.1 → 2.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: 8c7b95172b5158c95958e434443b7adc281b4439f7d1d1024a352edafd439e17
4
- data.tar.gz: '0295940bf898dd2be2b4285b1d39bda510da541cef2fc522bb9e633d62ddd171'
3
+ metadata.gz: 6ba12d5e4ad9e76a2bec62028b14952b2081b7ea16dbabf00eb14eb1db4b0ab6
4
+ data.tar.gz: 23d575919475820563f308fdb335e16089eb981c2350c3484e191330fc74d90d
5
5
  SHA512:
6
- metadata.gz: a4eff89945f0b07803299f19c10142c2d55038f332c459a4bcd9217197001ba5e1227a5ed5f9badb82e58136800bbc1582380acf3104b77bc4f99383495518ad
7
- data.tar.gz: 6a5c37f919ebead2fc0abc5c3084fcc1a668bbc706857ecb29f69bbaa52b44ed94bbc225a3ca3f21ba3a9ab9dc07a1b29daf0b1e558a1abfd8977d529644de4c
6
+ metadata.gz: 6e8286ddd22170784525f2f81e76a0ff646e0ae91318539fb6fafac71c6fab537ffcdc33be5756ef048a16ea220a5ef5ce182c2ac5ab5dbdc956e4fd8d079676
7
+ data.tar.gz: f35c4da5e96629af26b9a49f47c4a639d3199025a437e63ab2ecd2f1ff2364529774935879f5c3014422e565aed4710727737848912cb1dc467b924f0f421248
@@ -3,8 +3,9 @@ sudo: false
3
3
  cache: bundler
4
4
 
5
5
  rvm:
6
- - 2.4.1
7
- - 2.3.4
6
+ - 2.5.1
7
+ - 2.4.4
8
+ - 2.3.7
8
9
 
9
10
  gemfile:
10
11
  - Gemfile
@@ -27,22 +27,17 @@ Gem::Specification.new do |s|
27
27
 
28
28
  s.required_ruby_version = ">= 2.3.0"
29
29
 
30
- # prometheus-client provides no guaranteed backwards compatibility,
31
- # and in fact happily breaks things with no notice, so we're stuck
32
- # with hard-coding a specific version to avoid unexpected disaster.
33
- s.add_runtime_dependency "prometheus-client", "0.7.1"
30
+ s.add_runtime_dependency "prometheus-client", "~> 2.0"
34
31
  s.add_runtime_dependency "rack", "~> 2.0"
35
32
 
36
33
  s.add_development_dependency 'bundler'
37
34
  s.add_development_dependency 'github-release'
38
35
  s.add_development_dependency 'git-version-bump'
39
36
  s.add_development_dependency 'guard-rspec'
40
- s.add_development_dependency 'guard-rubocop'
41
37
  s.add_development_dependency 'rack-test'
42
38
  s.add_development_dependency 'rake', "~> 12.0"
43
39
  s.add_development_dependency 'redcarpet'
44
40
  s.add_development_dependency 'rspec'
45
- s.add_development_dependency 'rubocop'
46
41
  s.add_development_dependency 'simplecov'
47
42
  s.add_development_dependency 'yard'
48
43
  end
@@ -65,9 +65,12 @@ module Frankenstein
65
65
  #
66
66
  # @param docstring [#to_s] the descriptive help text for the metric.
67
67
  #
68
+ # @param labels [Array<Symbol>] the labels which all time series for this
69
+ # metric must possess.
70
+ #
68
71
  # @param type [Symbol] what type of metric you're returning. It's uncommon
69
72
  # to want anything other than `:gauge` here (the default), because
70
- # when you're collecting external data it's uncommon to be able to
73
+ # when you're collecting external data it's unlikely you'll be able to
71
74
  # trust that your external data source will behave like a proper
72
75
  # counter (or histogram or summary), but if you want the flexibility,
73
76
  # it's there for you. If you do decide to try your hand at collecting
@@ -87,8 +90,8 @@ module Frankenstein
87
90
  #
88
91
  # @param collector [Proc] the code to run on every scrape request.
89
92
  #
90
- def initialize(name, docstring, type: :gauge, logger: Logger.new('/dev/null'), registry: Prometheus::Client.registry, &collector)
91
- @validator = Prometheus::Client::LabelSetValidator.new
93
+ def initialize(name, docstring:, labels: [], type: :gauge, logger: Logger.new('/dev/null'), registry: Prometheus::Client.registry, &collector)
94
+ @validator = Prometheus::Client::LabelSetValidator.new(expected_labels: labels)
92
95
 
93
96
  validate_name(name)
94
97
  validate_docstring(docstring)
@@ -104,14 +107,14 @@ module Frankenstein
104
107
  @registry = registry
105
108
  @collector = collector
106
109
 
107
- @errors_metric = @registry.counter(:"#{@name}_collection_errors_total", "Errors encountered while collecting for #{@name}")
110
+ @errors_metric = @registry.counter(:"#{@name}_collection_errors_total", docstring: "Errors encountered while collecting for #{@name}")
108
111
  @registry.register(self)
109
112
  end
110
113
 
111
114
  # Retrieve the value for the given labelset.
112
115
  #
113
116
  def get(labels = {})
114
- @validator.validate(labels)
117
+ @validator.validate_labelset!(labels)
115
118
 
116
119
  values[labels]
117
120
  end
@@ -126,7 +129,7 @@ module Frankenstein
126
129
  @errors_metric.increment(class: "NotAHashError")
127
130
  return {}
128
131
  end
129
- results.keys.each { |labelset| @validator.validate(labelset) }
132
+ results.keys.each { |labelset| @validator.validate_labelset!(labelset) }
130
133
  end
131
134
  rescue StandardError => ex
132
135
  @logger.error(progname) { (["Exception in collection: #{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ") }
@@ -0,0 +1,70 @@
1
+ require 'frankenstein/collected_metric'
2
+ require 'etc'
3
+
4
+ module Frankenstein
5
+ # Allow registration of metrics for Ruby GC statistics.
6
+ #
7
+ module ProcessMetrics
8
+ # Register generic process metrics.
9
+ #
10
+ # Generates collected metric objects for all of the [recommended process
11
+ # metrics](https://prometheus.io/docs/instrumenting/writing_clientlibs/#process-metrics)
12
+ # that can be reasonably obtained using Ruby on the platform that the process
13
+ # is running on.
14
+ #
15
+ # @param registry [Prometheus::Client::Registry] specify the metrics
16
+ # registry in which to register the GC-related metrics.
17
+ #
18
+ # @param logger [Logger] where to log any problems which some sort of
19
+ #
20
+ def self.register(registry = Prometheus::Client.registry, logger: Logger.new("/dev/null"))
21
+ registry.gauge(:process_start_time_seconds, docstring: "Start time of the process since unix epoch in seconds").set(Time.now.to_f)
22
+
23
+ page_size = Etc.sysconf(Etc::SC_PAGESIZE)
24
+ hz = Etc.sysconf(Etc::SC_CLK_TCK)
25
+
26
+ stat_file = "/proc/#{Process.pid}/stat".freeze
27
+
28
+ if File.exist?(stat_file)
29
+ Frankenstein::CollectedMetric.new(:process_cpu_seconds_total, docstring: "Total user and system CPU time spent in seconds", registry: registry, logger: logger, labels: [:mode]) do
30
+ stats = File.read(stat_file).split(" ")
31
+ { { mode: "user" } => stats[13].to_f / hz, { mode: "system" } => stats[14].to_f / hz }
32
+ end
33
+
34
+ Frankenstein::CollectedMetric.new(:process_virtual_memory_bytes, docstring: "Virtual memory size in bytes", registry: registry, logger: logger) do
35
+ stats = File.read(stat_file).split(" ")
36
+ { {} => stats[22].to_i }
37
+ end
38
+
39
+ Frankenstein::CollectedMetric.new(:process_resident_memory_bytes, docstring: "Resident memory size in bytes", registry: registry, logger: logger) do
40
+ stats = File.read(stat_file).split(" ")
41
+ { {} => stats[23].to_i * page_size }
42
+ end
43
+ end
44
+
45
+ fd_dir = "/proc/#{Process.pid}/fd".freeze
46
+
47
+ if File.exist?(fd_dir)
48
+ Frankenstein::CollectedMetric.new(:process_open_fds, docstring: "Number of open file descriptors", registry: registry, logger: logger) do
49
+ { {} => Dir["#{fd_dir}/*"].length }
50
+ end
51
+ end
52
+
53
+ if Process.respond_to?(:getrlimit)
54
+ Frankenstein::CollectedMetric.new(:process_max_fds, docstring: "Maximum number of open file descriptors", registry: registry, logger: logger) do
55
+ { {} => Process.getrlimit(:NOFILE).first }
56
+ end
57
+
58
+ Frankenstein::CollectedMetric.new(:process_virtual_memory_max_bytes, docstring: "Maximum amount of virtual memory available in bytes", registry: registry, logger: logger) do
59
+ { {} => Process.getrlimit(:AS).first }
60
+ end
61
+ end
62
+
63
+ if GC.respond_to?(:stat) && GC.stat[:heap_allocated_pages]
64
+ Frankenstein::CollectedMetric.new(:process_heap_bytes, docstring: "Process heap size in bytes", registry: registry, logger: logger) do
65
+ { {} => GC.stat[:heap_allocated_pages] * page_size }
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,25 @@
1
+ module Frankenstein
2
+ # Mix-in to add #remove to Prometheus metrics
3
+ module RemoveTimeSeries
4
+ # Remove a time series from a metric.
5
+ #
6
+ # @param labels [Hash<Symbol, String>] the label set to remove.
7
+ #
8
+ def remove(labels)
9
+ @store.remove(labels)
10
+ end
11
+
12
+ # Mix-in to add #remove support to the default Synchronized metric store.
13
+ module SynchronizedMetricStore
14
+ # Remove a time series from the metric store.
15
+ #
16
+ # @private
17
+ def remove(labels)
18
+ @internal_store.delete(labels)
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ Prometheus::Client::Metric.include(Frankenstein::RemoveTimeSeries)
25
+ Prometheus::Client::DataStores::Synchronized.const_get(:MetricStore).include(Frankenstein::RemoveTimeSeries::SynchronizedMetricStore)
@@ -65,17 +65,25 @@ module Frankenstein
65
65
  # It should be a singular and indefinite noun phrase, to maximise the
66
66
  # chances that it will fit neatly into the generated description text.
67
67
  #
68
+ # @param labels [Array<Symbol>] the names of the labels that will be
69
+ # set on most of the metrics created by this instance.
70
+ #
71
+ # @param duration_labels [Array<Symbol>] the names of the labels which will
72
+ # be set on the `_duration_seconds` histogram. By default, the value
73
+ # of the `labels` parameter will be used, but if you want to have a separate
74
+ # label set for your duration histogram, this is what you want.
75
+ #
68
76
  # @param registry [Prometheus::Client::Registry] the client registry in
69
77
  # which all the metrics will be created. The default will put all the
70
78
  # metrics in the Prometheus Client's default registry, which may or may
71
79
  # not be what you're up for. If you're using Frankenstein::Server, you
72
80
  # want `stats_server.registry`.
73
81
  #
74
- def initialize(prefix, outgoing: true, description: prefix, registry: Prometheus::Client.registry)
75
- @requests = registry.counter(:"#{prefix}_requests_total", "Number of #{description} requests #{outgoing ? 'sent' : 'received'}")
76
- @durations = registry.histogram(:"#{prefix}_request_duration_seconds", "Time taken to #{outgoing ? 'receive' : 'send'} a #{description} response")
77
- @exceptions = registry.counter(:"#{prefix}_exceptions_total", "Number of exceptions raised by the #{description} code")
78
- @current = registry.gauge(:"#{prefix}_in_progress_count", "Number of #{description} requests currently in progress")
82
+ def initialize(prefix, labels: [], duration_labels: nil, outgoing: true, description: prefix, registry: Prometheus::Client.registry)
83
+ @requests = registry.counter(:"#{prefix}_requests_total", docstring: "Number of #{description} requests #{outgoing ? 'sent' : 'received'}", labels: labels)
84
+ @durations = registry.histogram(:"#{prefix}_request_duration_seconds", docstring: "Time taken to #{outgoing ? 'receive' : 'send'} a #{description} response", labels: duration_labels || labels)
85
+ @exceptions = registry.counter(:"#{prefix}_exceptions_total", docstring: "Number of exceptions raised by the #{description} code", labels: labels + [:class])
86
+ @current = registry.gauge(:"#{prefix}_in_progress_count", docstring: "Number of #{description} requests currently in progress", labels: labels)
79
87
 
80
88
  # Prometheus::Client::Gauge doesn't (yet) have a built-in way to
81
89
  # atomically "adjust" a gauge, only get the current value and set a
@@ -149,7 +157,7 @@ module Frankenstein
149
157
  # have the same set of labels. If you fail to do this, an exception
150
158
  # will be raised by Prometheus after the block is executed.
151
159
  #
152
- # @raise [Prometheus::Request::NoBlockError] if you didn't pass a block to
160
+ # @raise [Frankenstein::Request::NoBlockError] if you didn't pass a block to
153
161
  # call. There's nothing to instrument!
154
162
  #
155
163
  # @raise [Prometheus::Client::LabelSetValidator::LabelSetError] if you
@@ -170,21 +178,21 @@ module Frankenstein
170
178
  "No block passed to #{self.class}#measure"
171
179
  end
172
180
 
173
- @requests.increment(labels, 1)
174
- @mutex.synchronize { @current.set(labels, (@current.get(labels) || 0) + 1) }
181
+ @requests.increment(labels: labels)
182
+ @mutex.synchronize { @current.set((@current.get(labels: labels) || 0) + 1, labels: labels) }
175
183
 
176
184
  res_labels = labels.dup
177
185
 
178
186
  begin
179
187
  yield(res_labels).tap do
180
188
  elapsed_time = Time.now - start_time
181
- @durations.observe(res_labels, elapsed_time)
189
+ @durations.observe(elapsed_time, labels: res_labels)
182
190
  end
183
191
  rescue Exception => ex
184
- @exceptions.increment(labels.merge(class: ex.class.to_s), 1)
192
+ @exceptions.increment(labels: labels.merge(class: ex.class.to_s))
185
193
  raise
186
194
  ensure
187
- @mutex.synchronize { @current.set(labels, @current.get(labels) - 1) }
195
+ @mutex.synchronize { @current.set(@current.get(labels: labels) - 1, labels: labels) }
188
196
  end
189
197
  end
190
198
  end
@@ -0,0 +1,24 @@
1
+ require 'frankenstein/collected_metric'
2
+
3
+ module Frankenstein
4
+ # Allow registration of metrics for Ruby GC statistics.
5
+ #
6
+ module RubyGCMetrics
7
+ # Register Ruby GC metrics.
8
+ #
9
+ # For every statistic provided by the Ruby VM under the module method
10
+ # `GC.stat`, a metric is registered named `ruby_gc_<stat>`, which
11
+ # provides a dimensionless metric with the value of the statistic.
12
+ #
13
+ # @param registry [Prometheus::Client::Registry] specify the metrics
14
+ # registry in which to register the GC-related metrics.
15
+ #
16
+ def self.register(registry = Prometheus::Client.registry)
17
+ GC.stat.each do |k, v|
18
+ Frankenstein::CollectedMetric.new(:"ruby_gc_#{k}", docstring: "Ruby GC parameter #{k}", registry: registry) do
19
+ { {} => GC.stat[k] }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'frankenstein/collected_metric'
2
+
3
+ module Frankenstein
4
+ # Allow registration of metrics for Ruby VM statistics.
5
+ #
6
+ module RubyVMMetrics
7
+ # Register Ruby VM metrics.
8
+ #
9
+ # For every statistic provided by the Ruby VM under the module method
10
+ # `RubyVM.stat`, a metric is registered named `ruby_vm_<stat>`, which
11
+ # provides a dimensionless metric with the value of the statistic.
12
+ #
13
+ # @param registry [Prometheus::Client::Registry] specify the metrics
14
+ # registry in which to register the GC-related metrics.
15
+ #
16
+ def self.register(registry = Prometheus::Client.registry)
17
+ RubyVM.stat.each do |k, v|
18
+ Frankenstein::CollectedMetric.new(:"ruby_vm_#{k}", docstring: "Ruby VM parameter #{k}", registry: registry) do
19
+ { {} => RubyVM.stat[k] }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -66,41 +66,35 @@ module Frankenstein
66
66
  @op_cv = ConditionVariable.new
67
67
  end
68
68
 
69
- # Start the server instance running in a separate thread.
69
+ # Start the server instance running.
70
70
  #
71
- # This method returns once the server is just about ready to start serving
72
- # requests.
71
+ # This method will return only after `#shutdown` is called (presumably from
72
+ # another thread).
73
73
  #
74
74
  def run
75
75
  @op_mutex.synchronize do
76
76
  return AlreadyRunningError if @server
77
77
 
78
- @server_thread = Thread.new do
79
- @op_mutex.synchronize do
80
- begin
81
- wrapped_logger = Frankenstein::Server::WEBrickLogger.new(logger: @logger)
82
- @server = WEBrick::HTTPServer.new(Logger: wrapped_logger, BindAddress: nil, Port: @port, AccessLog: [[wrapped_logger, WEBrick::AccessLog::COMMON_LOG_FORMAT]])
83
- @server.mount "/", Rack::Handler::WEBrick, app
84
- rescue => ex
85
- #:nocov:
86
- @logger.fatal("Frankenstein::Server#run") { (["Exception while trying to create WEBrick::HTTPServer: #{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ") }
87
- #:nocov:
88
- ensure
89
- @op_cv.signal
90
- end
91
- end
92
-
93
- begin
94
- @server.start if @server
95
- rescue => ex
96
- #:nocov:
97
- @logger.fatal("Frankenstein::Server#run") { (["Exception while running WEBrick::HTTPServer: #{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ") }
98
- #:nocov:
99
- end
78
+ begin
79
+ wrapped_logger = Frankenstein::Server::WEBrickLogger.new(logger: @logger, progname: "Frankenstein::Server")
80
+ @server = WEBrick::HTTPServer.new(Logger: wrapped_logger, BindAddress: nil, Port: @port, AccessLog: [[wrapped_logger, WEBrick::AccessLog::COMMON_LOG_FORMAT]])
81
+ @server.mount "/", Rack::Handler::WEBrick, app
82
+ rescue => ex
83
+ #:nocov:
84
+ @logger.fatal("Frankenstein::Server#run") { (["Exception while trying to create WEBrick::HTTPServer: #{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ") }
85
+ #:nocov:
86
+ ensure
87
+ @op_cv.signal
100
88
  end
101
89
  end
102
90
 
103
- @op_mutex.synchronize { @op_cv.wait(@op_mutex) until @server }
91
+ begin
92
+ @server.start if @server
93
+ rescue => ex
94
+ #:nocov:
95
+ @logger.fatal("Frankenstein::Server#run") { (["Exception while running WEBrick::HTTPServer: #{ex.message} (#{ex.class})"] + ex.backtrace).join("\n ") }
96
+ #:nocov:
97
+ end
104
98
  end
105
99
 
106
100
  # Terminate a running server instance.
@@ -112,8 +106,6 @@ module Frankenstein
112
106
  return nil if @server.nil?
113
107
  @server.shutdown
114
108
  @server = nil
115
- @server_thread.join
116
- @server_thread = nil
117
109
  end
118
110
  end
119
111
 
@@ -125,9 +117,7 @@ module Frankenstein
125
117
  builder.use Rack::Deflater, if: ->(_, _, _, body) { body.any? && body[0].length > 512 }
126
118
  builder.use Prometheus::Middleware::Collector,
127
119
  registry: @registry,
128
- metrics_prefix: @metrics_prefix,
129
- counter_label_builder: ->(_, _) { {} },
130
- duration_label_builder: ->(_, _) { {} }
120
+ metrics_prefix: @metrics_prefix
131
121
  builder.use Prometheus::Middleware::Exporter, registry: @registry
132
122
  builder.run ->(_) { [301, { 'Location' => "/metrics", 'Content-Type' => 'text/plain' }, ["Try /metrics"]] }
133
123
  builder.to_app
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: frankenstein
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-28 00:00:00.000000000 Z
11
+ date: 2020-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prometheus-client
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.7.1
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.7.1
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rack
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -94,20 +94,6 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: guard-rubocop
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: rack-test
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -164,20 +150,6 @@ dependencies:
164
150
  - - ">="
165
151
  - !ruby/object:Gem::Version
166
152
  version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: rubocop
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: '0'
181
153
  - !ruby/object:Gem::Dependency
182
154
  name: simplecov
183
155
  requirement: !ruby/object:Gem::Requirement
@@ -217,7 +189,6 @@ extensions: []
217
189
  extra_rdoc_files: []
218
190
  files:
219
191
  - ".gitignore"
220
- - ".rubocop.yml"
221
192
  - ".travis.yml"
222
193
  - ".yardopts"
223
194
  - CODE_OF_CONDUCT.md
@@ -228,7 +199,11 @@ files:
228
199
  - lib/frankenstein.rb
229
200
  - lib/frankenstein/collected_metric.rb
230
201
  - lib/frankenstein/error.rb
202
+ - lib/frankenstein/process_metrics.rb
203
+ - lib/frankenstein/remove_time_series.rb
231
204
  - lib/frankenstein/request.rb
205
+ - lib/frankenstein/ruby_gc_metrics.rb
206
+ - lib/frankenstein/ruby_vm_metrics.rb
232
207
  - lib/frankenstein/server.rb
233
208
  - lib/frankenstein/server/webrick_logger.rb
234
209
  homepage: https://github.com/discourse/frankenstein
@@ -249,8 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
249
224
  - !ruby/object:Gem::Version
250
225
  version: '0'
251
226
  requirements: []
252
- rubyforge_project:
253
- rubygems_version: 2.7.7
227
+ rubygems_version: 3.0.3
254
228
  signing_key:
255
229
  specification_version: 4
256
230
  summary: or, the Modern Prometheus
@@ -1,104 +0,0 @@
1
- AllCops:
2
- TargetRubyVersion: 2.4
3
- DisabledByDefault: true
4
-
5
- # Prefer &&/|| over and/or.
6
- Style/AndOr:
7
- Enabled: true
8
-
9
- # Do not use braces for hash literals when they are the last argument of a
10
- # method call.
11
- Style/BracesAroundHashParameters:
12
- Enabled: true
13
-
14
- # Align `when` with `case`.
15
- Layout/CaseIndentation:
16
- Enabled: true
17
-
18
- # Align comments with method definitions.
19
- Layout/CommentIndentation:
20
- Enabled: true
21
-
22
- # No extra empty lines.
23
- Layout/EmptyLines:
24
- Enabled: true
25
-
26
- # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
27
- Style/HashSyntax:
28
- Enabled: true
29
-
30
- # Two spaces, no tabs (for indentation).
31
- Layout/IndentationWidth:
32
- Enabled: true
33
-
34
- Layout/SpaceAfterColon:
35
- Enabled: true
36
-
37
- Layout/SpaceAfterComma:
38
- Enabled: true
39
-
40
- Layout/SpaceAroundEqualsInParameterDefault:
41
- Enabled: true
42
-
43
- Layout/SpaceAroundKeyword:
44
- Enabled: true
45
-
46
- Layout/SpaceAroundOperators:
47
- Enabled: true
48
-
49
- Layout/SpaceBeforeFirstArg:
50
- Enabled: true
51
-
52
- # Defining a method with parameters needs parentheses.
53
- Style/MethodDefParentheses:
54
- Enabled: true
55
-
56
- # Use `foo {}` not `foo{}`.
57
- Layout/SpaceBeforeBlockBraces:
58
- Enabled: true
59
-
60
- # Use `foo { bar }` not `foo {bar}`.
61
- Layout/SpaceInsideBlockBraces:
62
- Enabled: true
63
-
64
- # Use `{ a: 1 }` not `{a:1}`.
65
- Layout/SpaceInsideHashLiteralBraces:
66
- Enabled: true
67
-
68
- Layout/SpaceInsideParens:
69
- Enabled: true
70
-
71
- # Detect hard tabs, no hard tabs.
72
- Layout/Tab:
73
- Enabled: true
74
-
75
- # Blank lines should not have any spaces.
76
- Layout/TrailingBlankLines:
77
- Enabled: true
78
-
79
- # No trailing whitespace.
80
- Layout/TrailingWhitespace:
81
- Enabled: true
82
-
83
- Lint/BlockAlignment:
84
- Enabled: true
85
-
86
- # Align `end` with the matching keyword or starting expression except for
87
- # assignments, where it should be aligned with the LHS.
88
- Lint/EndAlignment:
89
- Enabled: true
90
- EnforcedStyleAlignWith: variable
91
-
92
- # Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
93
- Lint/RequireParentheses:
94
- Enabled: true
95
-
96
- Layout/MultilineMethodCallIndentation:
97
- Enabled: true
98
- EnforcedStyle: indented
99
-
100
- Layout/AlignHash:
101
- Enabled: true
102
-
103
- Bundler/OrderedGems:
104
- Enabled: false