step-track 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 223ca527f32902f873a8c4b34a8e083a6bb91ca4
4
+ data.tar.gz: 1f3c345c51bfe5aa3959795824561ce433609e7c
5
+ SHA512:
6
+ metadata.gz: 45ad270d69c98b573eea8b6bb53e747083e8a8511284726bac97737ced664aa8891a2bbd1cd1a68c4a3a9be0cc1470238a42c733ecf0a218e2c2f0c6fa00ee3a
7
+ data.tar.gz: dafca62752e93766a0377533cd3e3fe6ed6a946b41fe473076452d95c124548fa5fbd6c3a56edeb062829c1fbd1cfa19230ae67f06cf07e45b261c112ec37062
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ BSD 2-Clause License
2
+
3
+ Copyright (c) 2017, Matthias Geier
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StepTrack
4
+ extend self
5
+
6
+ REF = "step_track/%{track}"
7
+
8
+ def init(track)
9
+ raise ArgumentError, "callback block required" unless block_given?
10
+ Thread.current[ref(track)] = {
11
+ steps: [],
12
+ callback: Proc.new,
13
+ time: Time.now
14
+ }
15
+ end
16
+
17
+ def push(track, name, payload={})
18
+ require_init!(track)
19
+ track_ref = Thread.current[ref(track)]
20
+ last_step = track_ref[:steps].last
21
+ track_ref[:steps] << {
22
+ split: Time.now - (last_step&.[](:time) || track_ref[:time]),
23
+ duration: Time.now - track_ref[:time],
24
+ time: Time.now,
25
+ caller: caller[0],
26
+ name: name
27
+ }.merge(payload)
28
+ end
29
+
30
+ def done(track)
31
+ require_init!(track)
32
+ track_ref = Thread.current[ref(track)]
33
+ Thread.current[ref(track)] = nil
34
+ steps = track_ref.delete(:steps)
35
+ steps.each { |step| step.delete(:time) }
36
+ result = {step_count: steps.count}
37
+ result.merge!(steps.last || {})
38
+ steps.each_with_index do |step, i|
39
+ result.merge!(step.map { |k, v| ["step_#{i}_#{k}".to_sym, v] }.to_h)
40
+ end
41
+ return track_ref[:callback].call(result)
42
+ end
43
+
44
+ private
45
+
46
+ def ref(track)
47
+ (REF % {track: track}).to_sym
48
+ end
49
+
50
+ def initialized?(track)
51
+ !Thread.current[ref(track)].nil?
52
+ end
53
+
54
+ def require_init!(track)
55
+ raise ArgumentError, "track not initialized" unless initialized?(track)
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module StepTrack
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "step_track"
2
+ require "minitest/spec"
3
+ require "minitest/autorun"
4
+
5
+ Dir["**/*_test.rb"].shuffle.each { |f| load f }
@@ -0,0 +1,99 @@
1
+ describe "StepTrack" do
2
+ after do
3
+ Thread.current[StepTrack.send(:ref, "test")] = nil
4
+ end
5
+
6
+ describe ".init" do
7
+ it "raises when no block is given" do
8
+ begin
9
+ rescued = false
10
+ StepTrack.init("test")
11
+ rescue ArgumentError
12
+ rescued = true
13
+ end
14
+ assert rescued
15
+ end
16
+
17
+ it "stores the initialized data into thread context" do
18
+ StepTrack.init("test") { }
19
+ data = Thread.current[StepTrack.send(:ref, "test")]
20
+ assert_equal [], data[:steps],
21
+ "steps is no empty array #{data[:steps].inspect}"
22
+ assert data[:callback].is_a?(Proc),
23
+ "callback is no proc #{data[:callback].inspect}"
24
+ assert data[:time] <= Time.now,
25
+ "time #{data[:time].inspect} > #{Time.now.inspect}"
26
+ end
27
+ end
28
+
29
+ describe ".push" do
30
+ before do
31
+ StepTrack.init("test") { }
32
+ end
33
+
34
+ it "requires initialization" do
35
+ begin
36
+ rescued = false
37
+ StepTrack.push("no_init", "step")
38
+ rescue ArgumentError
39
+ rescued = true
40
+ end
41
+ assert rescued
42
+ end
43
+
44
+ it "pushes a step including payload into data" do
45
+ StepTrack.push("test", "step", moo: "bar")
46
+ data = Thread.current[StepTrack.send(:ref, "test")]
47
+ step = data[:steps].first
48
+ assert_equal 1, data[:steps].size
49
+ assert_equal "step", step[:name]
50
+ assert_equal "bar", step[:moo]
51
+ expected_keys = [:name, :split, :duration, :time, :caller]
52
+ assert_equal expected_keys, expected_keys & step.keys
53
+ end
54
+ end
55
+
56
+ describe ".done" do
57
+ before do
58
+ StepTrack.init("test") { |result| result }
59
+ StepTrack.push("test", "step", moo: "bar")
60
+ StepTrack.push("test", "last", gnu: "blu")
61
+ end
62
+
63
+ it "requires initialization" do
64
+ begin
65
+ rescued = false
66
+ StepTrack.done("no_init")
67
+ rescue ArgumentError
68
+ rescued = true
69
+ end
70
+ assert rescued
71
+ end
72
+
73
+ it "returns the callback result" do
74
+ result = StepTrack.done("test")
75
+ assert result.is_a?(Hash), "result is no hash #{result.inspect}"
76
+ end
77
+
78
+ it "sets a step count" do
79
+ result = StepTrack.done("test")
80
+ assert_equal 2, result[:step_count]
81
+ end
82
+
83
+ it "merges the last step into result" do
84
+ result = StepTrack.done("test")
85
+ assert_equal "last", result[:name]
86
+ expected_keys = [:name, :split, :duration, :caller]
87
+ assert_equal expected_keys, expected_keys & result.keys
88
+ end
89
+
90
+ it "enumerates every step into result" do
91
+ result = StepTrack.done("test")
92
+ expected_key_parts = [:name, :split, :duration, :caller]
93
+ 2.times do |i|
94
+ expected_keys = expected_key_parts.map { |k| "step_#{i}_#{k}".to_sym }
95
+ assert_equal expected_keys, expected_keys & result.keys
96
+ end
97
+ end
98
+ end
99
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: step-track
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Matthias Geier
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-03-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5.10'
27
+ description: Stores data fragments as steps for an executing trail
28
+ email: 'mayutamano@gmail.com '
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - LICENSE
34
+ - lib/step_track.rb
35
+ - lib/step_track/version.rb
36
+ - test/runner.rb
37
+ - test/step_track_test.rb
38
+ homepage: https://github.com/matthias-geier/track_step
39
+ licenses:
40
+ - BSD-2-Clause
41
+ metadata: {}
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 2.5.1
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: Tracks data fragments across the application
62
+ test_files:
63
+ - test/step_track_test.rb
64
+ - test/runner.rb