ddmetrics 1.0.1 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc9eff515c2d5ddd9cf35e2185643a05291e3590636ae9dcee272ca4982aa9d4
4
- data.tar.gz: a60d517b811fa2b421789138956d7580755a41c63fc844955dd7190d62489ea0
3
+ metadata.gz: 39768ef4439441b98cfdb0a376d40e2bddd019c3d9afd39565ff949bd7b95409
4
+ data.tar.gz: be2ae1de043350f9edb5824fb735b40f576d959fdc648f365339c396b06a6dbe
5
5
  SHA512:
6
- metadata.gz: 0cf2f5dd6f2a5f2e7dba26737f644d3c96589d8e4249adc83a4124d4859cab419b6513a593004a1c6e2650093742dcd1481bd1c1d73d048ceea20aa0316cc1d6
7
- data.tar.gz: bdd81032dc806a0ae195dd52d0def6dad76b2a7c308b24aebfb02608155db1f06dc77cf0996c0f7f56d3a155d1419ca82adac930b37258f60d7a241119a3553a
6
+ metadata.gz: 97defa4e6aab76e2d7d64f4b5099413157e2078f54674a38ca24ddf827629f92a2b2c4ee9a891c1ef08dd7c71a2990d8323f969750f8c2de3474de057ed01f2c
7
+ data.tar.gz: fd283484e52ef65e6941ec203a3077485d1ccbebe70ffdee0a5e50a7435711313329ba78090c614e7b1b42e077dc53594bc9d51c3b81f9ee7033d3091ea2512b
data/.rubocop.yml CHANGED
@@ -1,3 +1,11 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ require:
4
+ - rubocop-rake
5
+ - rubocop-rspec
6
+
7
+
8
+
1
9
  # ----- CONFIGURED -----
2
10
 
3
11
  AllCops:
@@ -13,7 +21,7 @@ Style/TrailingCommaInArrayLiteral:
13
21
  Style/TrailingCommaInHashLiteral:
14
22
  EnforcedStyleForMultiline: comma
15
23
 
16
- Layout/IndentArray:
24
+ Layout/FirstArrayElementIndentation:
17
25
  EnforcedStyle: consistent
18
26
 
19
27
  # Documentation lives elsewhere, and not everything needs to be documented.
@@ -31,32 +39,293 @@ Lint/AmbiguousBlockAssociation:
31
39
 
32
40
  # Cops for metrics are disabled because they should not cause tests to fail.
33
41
 
34
- Metrics/AbcSize:
35
- Enabled: false
36
-
37
- Metrics/BlockLength:
38
- Enabled: false
39
-
40
- Metrics/BlockNesting:
42
+ Metrics:
41
43
  Enabled: false
42
44
 
43
- Metrics/ClassLength:
45
+ Layout/LineLength:
44
46
  Enabled: false
45
47
 
46
- Metrics/CyclomaticComplexity:
47
- Enabled: false
48
-
49
- Metrics/LineLength:
50
- Enabled: false
51
-
52
- Metrics/MethodLength:
53
- Enabled: false
54
48
 
55
- Metrics/ModuleLength:
56
- Enabled: false
57
49
 
58
- Metrics/ParameterLists:
59
- Enabled: false
50
+ # ----- NEW -----
60
51
 
61
- Metrics/PerceivedComplexity:
62
- Enabled: false
52
+ Gemspec/DeprecatedAttributeAssignment: # new in 1.30
53
+ Enabled: true
54
+ Gemspec/DevelopmentDependencies: # new in 1.44
55
+ Enabled: true
56
+ Gemspec/RequireMFA: # new in 1.23
57
+ Enabled: true
58
+ Layout/LineContinuationLeadingSpace: # new in 1.31
59
+ Enabled: true
60
+ Layout/LineContinuationSpacing: # new in 1.31
61
+ Enabled: true
62
+ Layout/LineEndStringConcatenationIndentation: # new in 1.18
63
+ Enabled: true
64
+ Layout/SpaceBeforeBrackets: # new in 1.7
65
+ Enabled: true
66
+ Lint/AmbiguousAssignment: # new in 1.7
67
+ Enabled: true
68
+ Lint/AmbiguousOperatorPrecedence: # new in 1.21
69
+ Enabled: true
70
+ Lint/AmbiguousRange: # new in 1.19
71
+ Enabled: true
72
+ Lint/ConstantOverwrittenInRescue: # new in 1.31
73
+ Enabled: true
74
+ Lint/DeprecatedConstants: # new in 1.8
75
+ Enabled: true
76
+ Lint/DuplicateBranch: # new in 1.3
77
+ Enabled: true
78
+ Lint/DuplicateMagicComment: # new in 1.37
79
+ Enabled: true
80
+ Lint/DuplicateMatchPattern: # new in 1.50
81
+ Enabled: true
82
+ Lint/DuplicateRegexpCharacterClassElement: # new in 1.1
83
+ Enabled: true
84
+ Lint/EmptyBlock: # new in 1.1
85
+ Enabled: true
86
+ Lint/EmptyClass: # new in 1.3
87
+ Enabled: true
88
+ Lint/EmptyInPattern: # new in 1.16
89
+ Enabled: true
90
+ Lint/IncompatibleIoSelectWithFiberScheduler: # new in 1.21
91
+ Enabled: true
92
+ Lint/LambdaWithoutLiteralBlock: # new in 1.8
93
+ Enabled: true
94
+ Lint/MixedCaseRange: # new in 1.53
95
+ Enabled: true
96
+ Lint/NoReturnInBeginEndBlocks: # new in 1.2
97
+ Enabled: true
98
+ Lint/NonAtomicFileOperation: # new in 1.31
99
+ Enabled: true
100
+ Lint/NumberedParameterAssignment: # new in 1.9
101
+ Enabled: true
102
+ Lint/OrAssignmentToConstant: # new in 1.9
103
+ Enabled: true
104
+ Lint/RedundantDirGlobSort: # new in 1.8
105
+ Enabled: true
106
+ Lint/RedundantRegexpQuantifiers: # new in 1.53
107
+ Enabled: true
108
+ Lint/RefinementImportMethods: # new in 1.27
109
+ Enabled: true
110
+ Lint/RequireRangeParentheses: # new in 1.32
111
+ Enabled: true
112
+ Lint/RequireRelativeSelfPath: # new in 1.22
113
+ Enabled: true
114
+ Lint/SymbolConversion: # new in 1.9
115
+ Enabled: true
116
+ Lint/ToEnumArguments: # new in 1.1
117
+ Enabled: true
118
+ Lint/TripleQuotes: # new in 1.9
119
+ Enabled: true
120
+ Lint/UnexpectedBlockArity: # new in 1.5
121
+ Enabled: true
122
+ Lint/UnmodifiedReduceAccumulator: # new in 1.1
123
+ Enabled: true
124
+ Lint/UselessRescue: # new in 1.43
125
+ Enabled: true
126
+ Lint/UselessRuby2Keywords: # new in 1.23
127
+ Enabled: true
128
+ Naming/BlockForwarding: # new in 1.24
129
+ Enabled: true
130
+ Security/CompoundHash: # new in 1.28
131
+ Enabled: true
132
+ Security/IoMethods: # new in 1.22
133
+ Enabled: true
134
+ Style/ArgumentsForwarding: # new in 1.1
135
+ Enabled: true
136
+ Style/ArrayIntersect: # new in 1.40
137
+ Enabled: true
138
+ Style/CollectionCompact: # new in 1.2
139
+ Enabled: true
140
+ Style/ComparableClamp: # new in 1.44
141
+ Enabled: true
142
+ Style/ConcatArrayLiterals: # new in 1.41
143
+ Enabled: true
144
+ Style/DataInheritance: # new in 1.49
145
+ Enabled: true
146
+ Style/DirEmpty: # new in 1.48
147
+ Enabled: true
148
+ Style/DocumentDynamicEvalDefinition: # new in 1.1
149
+ Enabled: true
150
+ Style/EmptyHeredoc: # new in 1.32
151
+ Enabled: true
152
+ Style/EndlessMethod: # new in 1.8
153
+ Enabled: true
154
+ Style/EnvHome: # new in 1.29
155
+ Enabled: true
156
+ Style/ExactRegexpMatch: # new in 1.51
157
+ Enabled: true
158
+ Style/FetchEnvVar: # new in 1.28
159
+ Enabled: true
160
+ Style/FileEmpty: # new in 1.48
161
+ Enabled: true
162
+ Style/FileRead: # new in 1.24
163
+ Enabled: true
164
+ Style/FileWrite: # new in 1.24
165
+ Enabled: true
166
+ Style/HashConversion: # new in 1.10
167
+ Enabled: true
168
+ Style/HashExcept: # new in 1.7
169
+ Enabled: true
170
+ Style/IfWithBooleanLiteralBranches: # new in 1.9
171
+ Enabled: true
172
+ Style/InPatternThen: # new in 1.16
173
+ Enabled: true
174
+ Style/MagicCommentFormat: # new in 1.35
175
+ Enabled: true
176
+ Style/MapCompactWithConditionalBlock: # new in 1.30
177
+ Enabled: true
178
+ Style/MapToHash: # new in 1.24
179
+ Enabled: true
180
+ Style/MapToSet: # new in 1.42
181
+ Enabled: true
182
+ Style/MinMaxComparison: # new in 1.42
183
+ Enabled: true
184
+ Style/MultilineInPatternThen: # new in 1.16
185
+ Enabled: true
186
+ Style/NegatedIfElseCondition: # new in 1.2
187
+ Enabled: true
188
+ Style/NestedFileDirname: # new in 1.26
189
+ Enabled: true
190
+ Style/NilLambda: # new in 1.3
191
+ Enabled: true
192
+ Style/NumberedParameters: # new in 1.22
193
+ Enabled: true
194
+ Style/NumberedParametersLimit: # new in 1.22
195
+ Enabled: true
196
+ Style/ObjectThen: # new in 1.28
197
+ Enabled: true
198
+ Style/OpenStructUse: # new in 1.23
199
+ Enabled: true
200
+ Style/OperatorMethodCall: # new in 1.37
201
+ Enabled: true
202
+ Style/QuotedSymbols: # new in 1.16
203
+ Enabled: true
204
+ Style/RedundantArgument: # new in 1.4
205
+ Enabled: true
206
+ Style/RedundantArrayConstructor: # new in 1.52
207
+ Enabled: true
208
+ Style/RedundantConstantBase: # new in 1.40
209
+ Enabled: true
210
+ Style/RedundantCurrentDirectoryInPath: # new in 1.53
211
+ Enabled: true
212
+ Style/RedundantDoubleSplatHashBraces: # new in 1.41
213
+ Enabled: true
214
+ Style/RedundantEach: # new in 1.38
215
+ Enabled: true
216
+ Style/RedundantFilterChain: # new in 1.52
217
+ Enabled: true
218
+ Style/RedundantHeredocDelimiterQuotes: # new in 1.45
219
+ Enabled: true
220
+ Style/RedundantInitialize: # new in 1.27
221
+ Enabled: true
222
+ Style/RedundantLineContinuation: # new in 1.49
223
+ Enabled: true
224
+ Style/RedundantRegexpArgument: # new in 1.53
225
+ Enabled: true
226
+ Style/RedundantRegexpConstructor: # new in 1.52
227
+ Enabled: true
228
+ Style/RedundantSelfAssignmentBranch: # new in 1.19
229
+ Enabled: true
230
+ Style/RedundantStringEscape: # new in 1.37
231
+ Enabled: true
232
+ Style/ReturnNilInPredicateMethodDefinition: # new in 1.53
233
+ Enabled: true
234
+ Style/SelectByRegexp: # new in 1.22
235
+ Enabled: true
236
+ Style/SingleLineDoEndBlock: # new in 1.57
237
+ Enabled: true
238
+ Style/StringChars: # new in 1.12
239
+ Enabled: true
240
+ Style/SwapValues: # new in 1.1
241
+ Enabled: true
242
+ Style/YAMLFileRead: # new in 1.53
243
+ Enabled: true
244
+ Capybara/ClickLinkOrButtonStyle: # new in 2.19
245
+ Enabled: true
246
+ Capybara/MatchStyle: # new in 2.17
247
+ Enabled: true
248
+ Capybara/NegationMatcher: # new in 2.14
249
+ Enabled: true
250
+ Capybara/SpecificActions: # new in 2.14
251
+ Enabled: true
252
+ Capybara/SpecificFinders: # new in 2.13
253
+ Enabled: true
254
+ Capybara/SpecificMatcher: # new in 2.12
255
+ Enabled: true
256
+ Capybara/RSpec/HaveSelector: # new in 2.19
257
+ Enabled: true
258
+ Capybara/RSpec/PredicateMatcher: # new in 2.19
259
+ Enabled: true
260
+ FactoryBot/AssociationStyle: # new in 2.23
261
+ Enabled: true
262
+ FactoryBot/ConsistentParenthesesStyle: # new in 2.14
263
+ Enabled: true
264
+ FactoryBot/FactoryAssociationWithStrategy: # new in 2.23
265
+ Enabled: true
266
+ FactoryBot/FactoryNameStyle: # new in 2.16
267
+ Enabled: true
268
+ FactoryBot/IdSequence: # new in <<next>>
269
+ Enabled: true
270
+ FactoryBot/RedundantFactoryOption: # new in 2.23
271
+ Enabled: true
272
+ FactoryBot/SyntaxMethods: # new in 2.7
273
+ Enabled: true
274
+ RSpec/BeEmpty: # new in 2.20
275
+ Enabled: true
276
+ RSpec/BeEq: # new in 2.9.0
277
+ Enabled: true
278
+ RSpec/BeNil: # new in 2.9.0
279
+ Enabled: true
280
+ RSpec/ChangeByZero: # new in 2.11
281
+ Enabled: true
282
+ RSpec/ContainExactly: # new in 2.19
283
+ Enabled: true
284
+ RSpec/DuplicatedMetadata: # new in 2.16
285
+ Enabled: true
286
+ RSpec/EmptyMetadata: # new in 2.24
287
+ Enabled: true
288
+ RSpec/Eq: # new in 2.24
289
+ Enabled: true
290
+ RSpec/ExcessiveDocstringSpacing: # new in 2.5
291
+ Enabled: true
292
+ RSpec/IdenticalEqualityAssertion: # new in 2.4
293
+ Enabled: true
294
+ RSpec/IndexedLet: # new in 2.20
295
+ Enabled: true
296
+ RSpec/MatchArray: # new in 2.19
297
+ Enabled: true
298
+ RSpec/MetadataStyle: # new in 2.24
299
+ Enabled: true
300
+ RSpec/NoExpectationExample: # new in 2.13
301
+ Enabled: true
302
+ RSpec/PendingWithoutReason: # new in 2.16
303
+ Enabled: true
304
+ RSpec/ReceiveMessages: # new in 2.23
305
+ Enabled: true
306
+ RSpec/RedundantAround: # new in 2.19
307
+ Enabled: true
308
+ RSpec/SkipBlockInsideExample: # new in 2.19
309
+ Enabled: true
310
+ RSpec/SortMetadata: # new in 2.14
311
+ Enabled: true
312
+ RSpec/SpecFilePathFormat: # new in 2.24
313
+ Enabled: true
314
+ RSpec/SpecFilePathSuffix: # new in 2.24
315
+ Enabled: true
316
+ RSpec/SubjectDeclaration: # new in 2.5
317
+ Enabled: true
318
+ RSpec/VerifiedDoubleReference: # new in 2.10.0
319
+ Enabled: true
320
+ RSpec/Rails/AvoidSetupHook: # new in 2.4
321
+ Enabled: true
322
+ RSpec/Rails/HaveHttpStatus: # new in 2.12
323
+ Enabled: true
324
+ RSpec/Rails/InferredSpecType: # new in 2.14
325
+ Enabled: true
326
+ RSpec/Rails/MinitestAssertions: # new in 2.17
327
+ Enabled: true
328
+ RSpec/Rails/NegationBeValid: # new in 2.23
329
+ Enabled: true
330
+ RSpec/Rails/TravelAround: # new in 2.19
331
+ Enabled: true
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,112 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config --exclude-limit 300`
3
+ # on 2023-10-23 14:11:14 UTC using RuboCop version 1.57.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # This cop supports safe autocorrection (--autocorrect).
11
+ # Configuration parameters: EnforcedStyle.
12
+ # SupportedStyles: be, be_nil
13
+ RSpec/BeNil:
14
+ Exclude:
15
+ - 'spec/ddmetrics_spec.rb'
16
+
17
+ # Offense count: 15
18
+ # Configuration parameters: Prefixes, AllowedPatterns.
19
+ # Prefixes: when, with, without
20
+ RSpec/ContextWording:
21
+ Exclude:
22
+ - 'spec/ddmetrics/basic_summary_spec.rb'
23
+ - 'spec/ddmetrics/counter_spec.rb'
24
+ - 'spec/ddmetrics/stats_spec.rb'
25
+ - 'spec/ddmetrics/summary_spec.rb'
26
+ - 'spec/ddmetrics/table_spec.rb'
27
+
28
+ # Offense count: 3
29
+ # This cop supports safe autocorrection (--autocorrect).
30
+ # Configuration parameters: AllowConsecutiveOneLiners.
31
+ RSpec/EmptyLineAfterHook:
32
+ Exclude:
33
+ - 'spec/ddmetrics/basic_summary_spec.rb'
34
+ - 'spec/ddmetrics/counter_spec.rb'
35
+
36
+ # Offense count: 9
37
+ # Configuration parameters: CountAsOne.
38
+ RSpec/ExampleLength:
39
+ Max: 9
40
+
41
+ # Offense count: 1
42
+ # This cop supports unsafe autocorrection (--autocorrect-all).
43
+ # Configuration parameters: EnforcedStyle.
44
+ # SupportedStyles: method_call, block
45
+ RSpec/ExpectChange:
46
+ Exclude:
47
+ - 'spec/ddmetrics/basic_counter_spec.rb'
48
+
49
+ # Offense count: 8
50
+ # Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly.
51
+ # Include: **/*_spec*rb*, **/spec/**/*
52
+ RSpec/FilePath:
53
+ Exclude:
54
+ - 'spec/ddmetrics/basic_counter_spec.rb'
55
+ - 'spec/ddmetrics/basic_summary_spec.rb'
56
+ - 'spec/ddmetrics/counter_spec.rb'
57
+ - 'spec/ddmetrics/stats_spec.rb'
58
+ - 'spec/ddmetrics/stopwatch_spec.rb'
59
+ - 'spec/ddmetrics/summary_spec.rb'
60
+ - 'spec/ddmetrics/table_spec.rb'
61
+ - 'spec/ddmetrics_spec.rb'
62
+
63
+ # Offense count: 2
64
+ # This cop supports safe autocorrection (--autocorrect).
65
+ RSpec/MatchArray:
66
+ Exclude:
67
+ - 'spec/ddmetrics/counter_spec.rb'
68
+ - 'spec/ddmetrics/summary_spec.rb'
69
+
70
+ # Offense count: 6
71
+ RSpec/MultipleExpectations:
72
+ Max: 6
73
+
74
+ # Offense count: 32
75
+ # Configuration parameters: EnforcedStyle, IgnoreSharedExamples.
76
+ # SupportedStyles: always, named_only
77
+ RSpec/NamedSubject:
78
+ Exclude:
79
+ - 'spec/ddmetrics/basic_counter_spec.rb'
80
+ - 'spec/ddmetrics/basic_summary_spec.rb'
81
+ - 'spec/ddmetrics/counter_spec.rb'
82
+ - 'spec/ddmetrics/stats_spec.rb'
83
+ - 'spec/ddmetrics/summary_spec.rb'
84
+
85
+ # Offense count: 8
86
+ # Configuration parameters: Include, CustomTransform, IgnoreMethods, IgnoreMetadata.
87
+ # Include: **/*_spec.rb
88
+ RSpec/SpecFilePathFormat:
89
+ Exclude:
90
+ - '**/spec/routing/**/*'
91
+ - 'spec/ddmetrics/basic_counter_spec.rb'
92
+ - 'spec/ddmetrics/basic_summary_spec.rb'
93
+ - 'spec/ddmetrics/counter_spec.rb'
94
+ - 'spec/ddmetrics/stats_spec.rb'
95
+ - 'spec/ddmetrics/stopwatch_spec.rb'
96
+ - 'spec/ddmetrics/summary_spec.rb'
97
+ - 'spec/ddmetrics/table_spec.rb'
98
+ - 'spec/ddmetrics_spec.rb'
99
+
100
+ # Offense count: 1
101
+ # This cop supports safe autocorrection (--autocorrect).
102
+ Rake/Desc:
103
+ Exclude:
104
+ - 'Rakefile'
105
+
106
+ # Offense count: 2
107
+ # This cop supports unsafe autocorrection (--autocorrect-all).
108
+ # Configuration parameters: Mode.
109
+ Style/StringConcatenation:
110
+ Exclude:
111
+ - 'lib/ddmetrics/table.rb'
112
+ - 'scripts/release'
data/Gemfile CHANGED
@@ -5,11 +5,13 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  group :devel do
8
- gem 'codecov', require: false
9
8
  gem 'fuubar'
10
9
  gem 'rake'
11
10
  gem 'rspec'
12
11
  gem 'rspec-its'
13
- gem 'rubocop', '~> 0.52'
12
+ gem 'rubocop', '~> 1.57'
13
+ gem 'rubocop-rake', '~> 0.6.0'
14
+ gem 'rubocop-rspec', '~> 2.24'
15
+ gem 'simplecov', require: false
14
16
  gem 'timecop', '~> 0.9'
15
17
  end
data/NEWS.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # DDMetrics news
2
2
 
3
+ ## 1.1.0 (2023-10-31)
4
+
5
+ Features:
6
+
7
+ * Added `Stopwatch#run`
8
+
3
9
  ## 1.0.1 (2018-07-19)
4
10
 
5
11
  Enhancements:
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
  [![Gem downloads](https://img.shields.io/gem/dt/ddmetrics.svg)](http://rubygems.org/gems/ddmetrics)
3
3
  [![Build status](https://img.shields.io/travis/ddfreyne/ddmetrics.svg)](https://travis-ci.org/ddfreyne/ddmetrics)
4
4
  [![Code Climate](https://img.shields.io/codeclimate/github/ddfreyne/ddmetrics.svg)](https://codeclimate.com/github/ddfreyne/ddmetrics)
5
- [![Code Coverage](https://img.shields.io/codecov/c/github/ddfreyne/ddmetrics.svg)](https://codecov.io/gh/ddfreyne/ddmetrics)
6
5
 
7
6
  # DDMetrics
8
7
 
@@ -235,6 +234,25 @@ puts "That took #{stopwatch.duration}s."
235
234
  # Output: That took 2.012879s.
236
235
  ```
237
236
 
237
+ You can use `#run` with a block for convenience:
238
+
239
+ ```ruby
240
+ stopwatch.run do
241
+ sleep 1
242
+ end
243
+ ```
244
+
245
+ `#run` will return the value of the block:
246
+
247
+ ```ruby
248
+ result = stopwatch.run do
249
+ sleep 1
250
+ 'Donkey'
251
+ end
252
+ puts result
253
+ # Output: Donkey
254
+ ```
255
+
238
256
  You can query whether or not a stopwatch is running using `#running?`; `#stopped?` is the opposite of `#running?`.
239
257
 
240
258
  ## Development
data/ddmetrics.gemspec CHANGED
@@ -16,4 +16,5 @@ Gem::Specification.new do |spec|
16
16
 
17
17
  spec.files = `git ls-files -z`.split("\x0")
18
18
  spec.require_paths = ['lib']
19
+ spec.metadata['rubygems_mfa_required'] = 'true'
19
20
  end
@@ -30,6 +30,7 @@ module DDMetrics
30
30
  # @api private
31
31
  def validate_label(label)
32
32
  return if label.is_a?(Hash)
33
+
33
34
  raise ArgumentError, 'label argument must be a hash'
34
35
  end
35
36
  end
@@ -22,6 +22,7 @@ module DDMetrics
22
22
 
23
23
  def sum
24
24
  raise EmptyError if @values.empty?
25
+
25
26
  @values.reduce(:+)
26
27
  end
27
28
 
@@ -42,7 +43,7 @@ module DDMetrics
42
43
 
43
44
  target = (@values.size - 1) * fraction.to_f
44
45
  interp = target % 1.0
45
- sorted_values[target.floor] * (1.0 - interp) + sorted_values[target.ceil] * interp
46
+ (sorted_values[target.floor] * (1.0 - interp)) + (sorted_values[target.ceil] * interp)
46
47
  end
47
48
 
48
49
  private
@@ -2,6 +2,8 @@
2
2
 
3
3
  module DDMetrics
4
4
  class Stopwatch
5
+ NANOS_PER_SECOND = 1_000_000_000
6
+
5
7
  class AlreadyRunningError < StandardError
6
8
  def message
7
9
  'Cannot start, because stopwatch is already running'
@@ -21,24 +23,34 @@ module DDMetrics
21
23
  end
22
24
 
23
25
  def initialize
24
- @duration = 0.0
26
+ @duration = 0
25
27
  @last_start = nil
26
28
  end
27
29
 
30
+ def run
31
+ start
32
+ yield
33
+ ensure
34
+ stop
35
+ end
36
+
28
37
  def start
29
38
  raise AlreadyRunningError if running?
30
- @last_start = Time.now
39
+
40
+ @last_start = nanos_now
31
41
  end
32
42
 
33
43
  def stop
34
44
  raise NotRunningError unless running?
35
- @duration += (Time.now - @last_start)
45
+
46
+ @duration += (nanos_now - @last_start)
36
47
  @last_start = nil
37
48
  end
38
49
 
39
50
  def duration
40
51
  raise StillRunningError if running?
41
- @duration
52
+
53
+ @duration.to_f / NANOS_PER_SECOND
42
54
  end
43
55
 
44
56
  def running?
@@ -48,5 +60,11 @@ module DDMetrics
48
60
  def stopped?
49
61
  !running?
50
62
  end
63
+
64
+ private
65
+
66
+ def nanos_now
67
+ Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond)
68
+ end
51
69
  end
52
70
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DDMetrics
4
- VERSION = '1.0.1'
4
+ VERSION = '1.1.0'
5
5
  end
@@ -10,29 +10,51 @@ describe DDMetrics::Stopwatch do
10
10
  end
11
11
 
12
12
  it 'records correct duration after start+stop' do
13
- Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 0))
14
13
  stopwatch.start
15
-
16
- Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 1))
14
+ sleep 0.1
17
15
  stopwatch.stop
18
16
 
19
- expect(stopwatch.duration).to eq(1.0)
17
+ expect(stopwatch.duration).to be_within(0.01).of(0.1)
20
18
  end
21
19
 
22
20
  it 'records correct duration after start+stop+start+stop' do
23
- Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 0))
24
21
  stopwatch.start
25
-
26
- Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 1))
22
+ sleep 0.1
27
23
  stopwatch.stop
28
-
29
- Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 3))
24
+ sleep 0.1
30
25
  stopwatch.start
31
-
32
- Timecop.freeze(Time.local(2008, 9, 1, 10, 5, 6))
26
+ sleep 0.1
33
27
  stopwatch.stop
34
28
 
35
- expect(stopwatch.duration).to eq(1.0 + 3.0)
29
+ expect(stopwatch.duration).to be_within(0.02).of(0.2)
30
+ end
31
+
32
+ it 'records correct duration with single #run call' do
33
+ stopwatch.run do
34
+ sleep 0.1
35
+ end
36
+
37
+ expect(stopwatch.duration).to be_within(0.01).of(0.1)
38
+ end
39
+
40
+ it 'records correct duration with multiple #run calls' do
41
+ stopwatch.run do
42
+ sleep 0.1
43
+ end
44
+ stopwatch.run do
45
+ sleep 0.2
46
+ end
47
+
48
+ expect(stopwatch.duration).to be_within(0.03).of(0.3)
49
+ end
50
+
51
+ it 'returns the right value from a #run call' do
52
+ result = stopwatch.run do
53
+ sleep 0.1
54
+ 'donkey'
55
+ end
56
+
57
+ expect(result).to eq('donkey')
36
58
  end
37
59
 
38
60
  it 'errors when stopping when not started' do
data/spec/spec_helper.rb CHANGED
@@ -3,9 +3,6 @@
3
3
  require 'simplecov'
4
4
  SimpleCov.start
5
5
 
6
- require 'codecov'
7
- SimpleCov.formatter = SimpleCov::Formatter::Codecov
8
-
9
6
  require 'ddmetrics'
10
7
 
11
8
  require 'fuubar'
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddmetrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Defreyne
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-19 00:00:00.000000000 Z
11
+ date: 2023-10-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description:
13
+ description:
14
14
  email:
15
15
  - denis+rubygems@denis.ws
16
16
  executables: []
@@ -20,6 +20,7 @@ files:
20
20
  - ".gitignore"
21
21
  - ".rspec"
22
22
  - ".rubocop.yml"
23
+ - ".rubocop_todo.yml"
23
24
  - ".travis.yml"
24
25
  - CODE_OF_CONDUCT.md
25
26
  - Gemfile
@@ -53,8 +54,9 @@ files:
53
54
  homepage: https://github.com/ddfreyne/ddmetrics
54
55
  licenses:
55
56
  - MIT
56
- metadata: {}
57
- post_install_message:
57
+ metadata:
58
+ rubygems_mfa_required: 'true'
59
+ post_install_message:
58
60
  rdoc_options: []
59
61
  require_paths:
60
62
  - lib
@@ -69,9 +71,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
71
  - !ruby/object:Gem::Version
70
72
  version: '0'
71
73
  requirements: []
72
- rubyforge_project:
73
- rubygems_version: 2.7.7
74
- signing_key:
74
+ rubygems_version: 3.4.21
75
+ signing_key:
75
76
  specification_version: 4
76
77
  summary: Non-timeseries measurements for Ruby programs
77
78
  test_files: []