step-track 0.4.4 → 0.5.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
  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