step-track 0.4.4 → 0.5.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
  SHA1:
3
- metadata.gz: 2910a2b3884ec1d6c4dc68c915b635bebca88289
4
- data.tar.gz: 6a69a58a9bd79328406355ba006a69f92b9e94f1
3
+ metadata.gz: 2fca015c0eda1a8f39a54e934b2c5240849b2bf4
4
+ data.tar.gz: 8a8bc2e016e62b963119984850982eb095ac9e9a
5
5
  SHA512:
6
- metadata.gz: de480c9050dbf991ead7d0ffa53a300bb3a21a3278b6e3ed01e653b93137efc446cd24f4dac5e2cb7fa7bd9086e72e67c272c4e44e82acdd8333aba1d460c851
7
- data.tar.gz: 1b99f2d02ae9c1bf0443baab7f99a1267e2126295ef27a7d43445a0b6ff2ea93b7ab3940101c3e37b2c423c9170f4948f56c8613d540a1dfaa32f6708ebcd1ef
6
+ metadata.gz: 2e47f3d294dc30f5e0bf67220ae39a44e4f70a7309abf511564e0ff29e7fe06b2e24d911792b32a7595875c38dc8075dd040833c8e979248dba615e4dc6c5f74
7
+ data.tar.gz: 1ebaa9ee674a619342c4ee674326776e17ef41f4aaaee6b30f2e5a77d6276195b95a76bfb8c7038a74e834bc96bfb4d2ce0ac32981643d75e14368919b1ceb1c
@@ -6,12 +6,22 @@ module StepTrack
6
6
  REF = "step_track/%{track}"
7
7
  DEFAULT_CONFIG = {merge_key: :merge, error_key: :error}.freeze
8
8
 
9
+ def get_caller
10
+ @caller ||= ->() { caller[1].sub(Dir.pwd + "/", "") }
11
+ end
12
+
13
+ def set_caller=(&blk)
14
+ @caller = blk
15
+ end
16
+
9
17
  def init(track, config={})
10
18
  raise ArgumentError, "callback block required" unless block_given?
11
19
  Thread.current[ref(track)] = {
20
+ track_id: config[:track_id] || Thread.current.object_id,
12
21
  steps: [],
13
22
  callback: Proc.new,
14
- time: Time.now
23
+ time: Time.now,
24
+ caller: config&.[](:caller) || get_caller.()
15
25
  }.merge(DEFAULT_CONFIG).merge(config)
16
26
  end
17
27
 
@@ -24,7 +34,7 @@ module StepTrack
24
34
  split: Time.now.to_f - (last_step&.[](:time) || track_ref[:time]).to_f,
25
35
  duration: Time.now.to_f - track_ref[:time].to_f,
26
36
  time: Time.now,
27
- caller: merge_step&.[](:caller) || caller[0].sub(Dir.pwd + "/", ""),
37
+ caller: merge_step&.[](:caller) || get_caller.(),
28
38
  step_name: merge_step&.[](:step_name) || name
29
39
  ).merge(payload)
30
40
  end
@@ -35,28 +45,27 @@ module StepTrack
35
45
  Thread.current[ref(track)] = nil
36
46
  steps = track_ref.delete(:steps)
37
47
  steps.each { |step| step.delete(:time) }
38
- result = {step_count: steps.count}
48
+ result = {
49
+ step_count: steps.count,
50
+ caller: track_ref[:caller],
51
+ duration: Time.now.to_f - track_ref[:time].to_f,
52
+ track_id: track_ref[:track_id]
53
+ }
39
54
  if err = steps.detect { |s| s.key?(track_ref[:error_key]) }
40
55
  last_step = err.dup
41
56
  else
42
57
  last_step = steps.last&.dup || {}
43
58
  end
44
- last_step[:final_step_name] = last_step.delete(:step_name)
45
- result.merge!(last_step)
46
- steps.each_with_index do |step, i|
47
- name = name_dupe = step.delete(:step_name)
48
- j = 0
49
- while result.key?("step_#{name_dupe}_i".to_sym)
50
- j += 1
51
- name_dupe = "#{name}_#{j}"
52
- end
53
- name = name_dupe
54
- result.merge!(step.merge(i: i + 1).
55
- map { |k, v| ["step_#{name}_#{k}".to_sym, v] }.to_h)
56
- end
59
+ result[:final_step_name] = last_step.delete(:step_name)
60
+ merge_down_steps!(result, steps)
57
61
  return track_ref[:callback].call(result)
58
62
  end
59
63
 
64
+ def track_id(track)
65
+ require_init!(track)
66
+ return Thread.current[ref(track)][:track_id]
67
+ end
68
+
60
69
  def partition_into(payload, name)
61
70
  payload, other = payload.partition do |k, _v|
62
71
  k.to_s !~ /^step_#{name}_/
@@ -89,4 +98,18 @@ module StepTrack
89
98
  def require_init!(track)
90
99
  raise ArgumentError, "track not initialized" unless initialized?(track)
91
100
  end
101
+
102
+ def merge_down_steps!(result, steps)
103
+ steps.each_with_index do |step, i|
104
+ name = name_dupe = step.delete(:step_name)
105
+ j = 0
106
+ while result.key?("step_#{name_dupe}_i".to_sym)
107
+ j += 1
108
+ name_dupe = "#{name}_#{j}"
109
+ end
110
+ name = name_dupe
111
+ result.merge!(step.merge(i: i + 1).
112
+ map { |k, v| ["step_#{name}_#{k}".to_sym, v] }.to_h)
113
+ end
114
+ end
92
115
  end
@@ -1,3 +1,3 @@
1
1
  module StepTrack
2
- VERSION = "0.4.4"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -23,6 +23,15 @@ describe "StepTrack" do
23
23
  "callback is no proc #{data[:callback].inspect}"
24
24
  assert data[:time] <= Time.now,
25
25
  "time #{data[:time].inspect} > #{Time.now.inspect}"
26
+ assert_equal data[:track_id], Thread.current.object_id,
27
+ "track id is #{StepTrack.track_id("test")}"
28
+ refute_empty data[:caller], "caller is empty"
29
+ end
30
+
31
+ it "stores a track_id when given" do
32
+ StepTrack.init("test", track_id: "moobar") { }
33
+ assert_equal "moobar", StepTrack.track_id("test"),
34
+ "track id is #{StepTrack.track_id("test")}"
26
35
  end
27
36
  end
28
37
 
@@ -90,11 +99,26 @@ describe "StepTrack" do
90
99
  assert_equal 2, result[:step_count]
91
100
  end
92
101
 
93
- it "merges the last step into result" do
102
+ it "sets the final step name" do
94
103
  result = StepTrack.done("test")
95
104
  assert_equal "last", result[:final_step_name]
96
- expected_keys = [:split, :duration, :caller]
97
- assert_equal expected_keys, expected_keys & result.keys
105
+ end
106
+
107
+ it "sets a duration" do
108
+ result = StepTrack.done("test")
109
+ assert result[:duration].is_a?(Float), "duration is no Float"
110
+ assert result[:duration] > 0.0, "duration is not positive"
111
+ assert result[:duration] < 1.0, "duration is too long"
112
+ end
113
+
114
+ it "sets a caller" do
115
+ result = StepTrack.done("test")
116
+ assert_match %r{#{Regexp.escape(__FILE__)}}, result[:caller]
117
+ end
118
+
119
+ it "does not merge final step into results" do
120
+ result = StepTrack.done("test")
121
+ assert !result.key?(:gnu), "merged gnu into result"
98
122
  end
99
123
 
100
124
  it "merges the error into result when available" do
@@ -106,7 +130,7 @@ describe "StepTrack" do
106
130
 
107
131
  it "enumerates every step into result" do
108
132
  result = StepTrack.done("test")
109
- expected_key_parts = [:split, :duration, :caller]
133
+ expected_key_parts = [:i, :split, :duration, :caller]
110
134
 
111
135
  ["step", "last"].each_with_index do |n, i|
112
136
  expected_keys = expected_key_parts.map { |k| "step_#{n}_#{k}".to_sym }
@@ -117,7 +141,7 @@ describe "StepTrack" do
117
141
  it "enumerate duplicated step names with index in the result" do
118
142
  StepTrack.push("test", "last", gnu: "blu")
119
143
  result = StepTrack.done("test")
120
- expected_key_parts = [:split, :duration, :caller]
144
+ expected_key_parts = [:i, :split, :duration, :caller]
121
145
 
122
146
  ["step", "last", "last_1"].each_with_index do |n, i|
123
147
  expected_keys = expected_key_parts.map { |k| "step_#{n}_#{k}".to_sym }
@@ -125,4 +149,22 @@ describe "StepTrack" do
125
149
  end
126
150
  end
127
151
  end
152
+
153
+ describe ".track_id" do
154
+ it "raises when not initialized" do
155
+ assert_raises ArgumentError do
156
+ StepTrack.track_id("test")
157
+ end
158
+ end
159
+
160
+ it "gives nil track_id when initialized without track_id" do
161
+ StepTrack.init("test") { }
162
+ assert_equal Thread.current.object_id, StepTrack.track_id("test")
163
+ end
164
+
165
+ it "gives configured track_id when initialized with track_id" do
166
+ StepTrack.init("test", track_id: "1234") { }
167
+ assert_equal "1234", StepTrack.track_id("test")
168
+ end
169
+ end
128
170
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: step-track
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Geier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-25 00:00:00.000000000 Z
11
+ date: 2018-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest