probedock-ruby 0.1.0 → 0.1.1
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 +4 -4
- data/README.md +1 -1
- data/VERSION +1 -1
- data/lib/probe_dock_ruby/client.rb +3 -1
- data/lib/probe_dock_ruby/config.rb +13 -15
- data/lib/probe_dock_ruby/test_result.rb +23 -78
- data/lib/probe_dock_ruby/test_run.rb +3 -49
- data/lib/probe_dock_ruby.rb +1 -1
- metadata +2 -3
- data/lib/probe_dock_ruby/test_payload.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 23bf815842f4bd1f2c40d19802e6bde6d2343aee
|
4
|
+
data.tar.gz: f66d5ae1474538712d06fe75de4e096a462c60d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f95da27dbb3b7bff866d392719e97f5bc07685b3fa5617759a28ca4375551f9c5aef2a929458144eecfb12c384a5c98b31677f45065af866a691e406b0a394a
|
7
|
+
data.tar.gz: 5089ff9bfda8ff1755eee59deb59fec0e3d82005d0f37d396544ec2b63a788ea52baf6527e2abe1a5811b534a1373fe6257603aeae590beb1da5888efbc4ab64
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'paint'
|
2
|
+
|
1
3
|
module ProbeDockProbe
|
2
4
|
|
3
5
|
class Client
|
@@ -41,7 +43,7 @@ module ProbeDockProbe
|
|
41
43
|
|
42
44
|
def build_payload test_run, options = {}
|
43
45
|
begin
|
44
|
-
|
46
|
+
test_run.to_h options
|
45
47
|
rescue PayloadError => e
|
46
48
|
fail e.message
|
47
49
|
end
|
@@ -1,20 +1,13 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
|
-
# Utilities to send test results to Probe Dock.
|
4
3
|
module ProbeDockProbe
|
5
4
|
|
6
5
|
def self.config
|
7
|
-
@config ||= Config.new
|
6
|
+
@config ||= Config.new
|
8
7
|
end
|
9
8
|
|
10
|
-
def self.
|
11
|
-
|
12
|
-
yield config if block_given?
|
13
|
-
|
14
|
-
config.check!
|
15
|
-
config.load_warnings.each{ |w| warn Paint["Probe Dock - #{w}", :yellow] }
|
16
|
-
|
17
|
-
config
|
9
|
+
def self.config= config
|
10
|
+
@config = config
|
18
11
|
end
|
19
12
|
|
20
13
|
class Config
|
@@ -59,9 +52,9 @@ module ProbeDockProbe
|
|
59
52
|
@servers.clear
|
60
53
|
|
61
54
|
@load_warnings = []
|
62
|
-
|
55
|
+
config = load_config_files
|
63
56
|
|
64
|
-
@publish = parse_env_flag :publish,
|
57
|
+
@publish = parse_env_flag :publish, config.fetch(:publish, true)
|
65
58
|
@server_name = parse_env_option(:server) || config[:server]
|
66
59
|
@local_mode = parse_env_flag(:local) || !!config[:local]
|
67
60
|
|
@@ -87,9 +80,16 @@ module ProbeDockProbe
|
|
87
80
|
project_options.merge! api_id: @server.project_api_id if @server and @server.project_api_id
|
88
81
|
@project.update project_options
|
89
82
|
|
83
|
+
yield self if block_given?
|
84
|
+
|
85
|
+
check!
|
86
|
+
@load_warnings.each{ |w| warn Paint["Probe Dock - #{w}", :yellow] }
|
87
|
+
|
90
88
|
self
|
91
89
|
end
|
92
90
|
|
91
|
+
private
|
92
|
+
|
93
93
|
def check!
|
94
94
|
|
95
95
|
configs = [ home_config_file, working_config_file ]
|
@@ -106,8 +106,6 @@ module ProbeDockProbe
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
-
private
|
110
|
-
|
111
109
|
def build_servers config
|
112
110
|
|
113
111
|
default_server_options = { project_api_id: config[:project][:api_id] }
|
@@ -123,7 +121,7 @@ module ProbeDockProbe
|
|
123
121
|
|
124
122
|
configs = [ home_config_file, working_config_file ]
|
125
123
|
actual_configs = configs.select{ |f| File.exists? f }
|
126
|
-
return
|
124
|
+
return { servers: [], payload: {}, project: {} } if actual_configs.empty?
|
127
125
|
|
128
126
|
actual_configs.collect!{ |f| YAML.load_file f }
|
129
127
|
|
@@ -1,40 +1,42 @@
|
|
1
1
|
module ProbeDockProbe
|
2
2
|
class TestResult
|
3
|
-
attr_reader :key, :name, :category, :tags, :tickets, :data, :duration, :message
|
4
|
-
|
5
|
-
def initialize project,
|
3
|
+
attr_reader :key, :fingerprint, :name, :category, :tags, :tickets, :data, :duration, :message
|
4
|
+
|
5
|
+
def initialize project, options = {}
|
6
|
+
|
7
|
+
if !options[:fingerprint]
|
8
|
+
raise Error, "The :fingerprint option is required (unique identifier for the test)"
|
9
|
+
elsif !options[:name]
|
10
|
+
raise Error, "The :name option is required (human-friendly identifier for the test, not necessarily unique)"
|
11
|
+
elsif !options.key?(:passed)
|
12
|
+
raise Error, "The :passed option is required (indicates whether the test passed or not)"
|
13
|
+
elsif !options[:duration]
|
14
|
+
raise Error, "The :duration options is required (indicates how long it took to run the test)"
|
15
|
+
end
|
6
16
|
|
7
|
-
@
|
8
|
-
@
|
9
|
-
@
|
17
|
+
@key = options[:key]
|
18
|
+
@fingerprint = options[:fingerprint]
|
19
|
+
@name = options[:name]
|
10
20
|
|
11
|
-
@
|
12
|
-
|
13
|
-
|
14
|
-
instance_variable_set "@#{attr}".to_sym, send("extract_#{attr}".to_sym, example, groups)
|
15
|
-
end
|
21
|
+
@category = options[:category] || project.category
|
22
|
+
@tags = (wrap(options[:tags]) + wrap(project.tags)).compact.collect(&:to_s).uniq
|
23
|
+
@tickets = (wrap(options[:tickets]) + wrap(project.tickets)).compact.collect(&:to_s).uniq
|
16
24
|
|
17
25
|
@passed = !!options[:passed]
|
18
26
|
@duration = options[:duration]
|
19
27
|
@message = options[:message]
|
28
|
+
|
29
|
+
@data = options[:data] || {}
|
30
|
+
@data = @data.deep_stringify_keys if @data.respond_to? :deep_stringify_keys
|
20
31
|
end
|
21
32
|
|
22
33
|
def passed?
|
23
34
|
@passed
|
24
35
|
end
|
25
36
|
|
26
|
-
def grouped?
|
27
|
-
@grouped
|
28
|
-
end
|
29
|
-
|
30
|
-
def update options = {}
|
31
|
-
@passed &&= options[:passed]
|
32
|
-
@duration += options[:duration]
|
33
|
-
@message = [ @message, options[:message] ].select{ |m| m }.join("\n\n") if options[:message]
|
34
|
-
end
|
35
|
-
|
36
37
|
def to_h options = {}
|
37
38
|
{
|
39
|
+
'f' => @fingerprint,
|
38
40
|
'p' => @passed,
|
39
41
|
'd' => @duration
|
40
42
|
}.tap do |h|
|
@@ -48,63 +50,6 @@ module ProbeDockProbe
|
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
51
|
-
def self.extract_grouped example, groups = []
|
52
|
-
!!groups.collect{ |g| meta(g)[:grouped] }.compact.last
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.extract_key example, groups = []
|
56
|
-
(groups.collect{ |g| meta(g)[:key] } << meta(example)[:key]).compact.reject{ |k| k.strip.empty? }.last
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.meta holder
|
60
|
-
meta = holder.metadata[:probe_dock] || {}
|
61
|
-
if meta.kind_of? String
|
62
|
-
{ key: meta }
|
63
|
-
elsif meta.kind_of? Hash
|
64
|
-
meta
|
65
|
-
else
|
66
|
-
{}
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def meta *args
|
73
|
-
self.class.meta *args
|
74
|
-
end
|
75
|
-
|
76
|
-
def extract_grouped *args
|
77
|
-
self.class.extract_grouped *args
|
78
|
-
end
|
79
|
-
|
80
|
-
def extract_key *args
|
81
|
-
self.class.extract_key *args
|
82
|
-
end
|
83
|
-
|
84
|
-
def extract_name example, groups = []
|
85
|
-
parts = groups.dup
|
86
|
-
parts = parts[0, parts.index{ |p| meta(p)[:grouped] } + 1] if @grouped
|
87
|
-
parts << example unless @grouped
|
88
|
-
parts.collect{ |p| p.description.strip }.join ' '
|
89
|
-
end
|
90
|
-
|
91
|
-
def extract_category example, groups = []
|
92
|
-
cat = (groups.collect{ |g| meta(g)[:category] }.unshift(@category) << meta(example)[:category]).compact.last
|
93
|
-
cat ? cat.to_s : nil
|
94
|
-
end
|
95
|
-
|
96
|
-
def extract_tags example, groups = []
|
97
|
-
(wrap(@tags) + groups.collect{ |g| wrap meta(g)[:tags] } + (wrap meta(example)[:tags])).flatten.compact.uniq.collect(&:to_s)
|
98
|
-
end
|
99
|
-
|
100
|
-
def extract_tickets example, groups = []
|
101
|
-
(wrap(@tickets) + groups.collect{ |g| wrap meta(g)[:tickets] } + (wrap meta(example)[:tickets])).flatten.compact.uniq.collect(&:to_s)
|
102
|
-
end
|
103
|
-
|
104
|
-
def extract_data example, groups = []
|
105
|
-
meta(example)[:data] || {}
|
106
|
-
end
|
107
|
-
|
108
53
|
def wrap a
|
109
54
|
a.kind_of?(Array) ? a : [ a ]
|
110
55
|
end
|
@@ -9,23 +9,8 @@ module ProbeDockProbe
|
|
9
9
|
@project = project
|
10
10
|
end
|
11
11
|
|
12
|
-
def add_result
|
13
|
-
|
14
|
-
existing_result.update options
|
15
|
-
else
|
16
|
-
@results << TestResult.new(@project, example, groups, options)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def results_without_key
|
21
|
-
@results.select{ |r| !r.key or r.key.to_s.strip.empty? }
|
22
|
-
end
|
23
|
-
|
24
|
-
def results_by_key
|
25
|
-
@results.inject({}) do |memo,r|
|
26
|
-
(memo[r.key] ||= []) << r unless !r.key or r.key.to_s.strip.empty?
|
27
|
-
memo
|
28
|
-
end
|
12
|
+
def add_result options = {}
|
13
|
+
@results << TestResult.new(@project, options)
|
29
14
|
end
|
30
15
|
|
31
16
|
def to_h options = {}
|
@@ -45,40 +30,9 @@ module ProbeDockProbe
|
|
45
30
|
|
46
31
|
def validate!
|
47
32
|
# TODO: validate duration
|
48
|
-
|
33
|
+
# TODO: log information about duplicate keys (if any)
|
49
34
|
raise PayloadError.new("Missing project") if !@project
|
50
35
|
@project.validate!
|
51
|
-
|
52
|
-
# FIXME: log info/warnings
|
53
|
-
#validate_no_results_without_key
|
54
|
-
#validate_no_duplicate_keys
|
55
|
-
end
|
56
|
-
|
57
|
-
def validate_no_duplicate_keys
|
58
|
-
|
59
|
-
results_with_duplicate_key = results_by_key.select{ |k,r| r.length >= 2 }
|
60
|
-
return if results_with_duplicate_key.none?
|
61
|
-
|
62
|
-
msg = "the following keys are used by multiple test results".tap do |s|
|
63
|
-
results_with_duplicate_key.each_pair do |key,results|
|
64
|
-
s << "\n - #{key}"
|
65
|
-
results.each{ |r| s << "\n - #{r.name}" }
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
raise PayloadError.new(msg)
|
70
|
-
end
|
71
|
-
|
72
|
-
def validate_no_results_without_key
|
73
|
-
|
74
|
-
keyless = results_without_key
|
75
|
-
return if keyless.empty?
|
76
|
-
|
77
|
-
msg = "the following test results are missing a key".tap do |s|
|
78
|
-
keyless.each{ |r| s << "\n - #{r.name}" }
|
79
|
-
end
|
80
|
-
|
81
|
-
raise PayloadError.new(msg)
|
82
36
|
end
|
83
37
|
end
|
84
38
|
end
|
data/lib/probe_dock_ruby.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: probedock-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Oulevay (Alpha Hydrae)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-07-
|
11
|
+
date: 2015-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -198,7 +198,6 @@ files:
|
|
198
198
|
- lib/probe_dock_ruby/project.rb
|
199
199
|
- lib/probe_dock_ruby/server.rb
|
200
200
|
- lib/probe_dock_ruby/tasks.rb
|
201
|
-
- lib/probe_dock_ruby/test_payload.rb
|
202
201
|
- lib/probe_dock_ruby/test_result.rb
|
203
202
|
- lib/probe_dock_ruby/test_run.rb
|
204
203
|
- lib/probe_dock_ruby/uid.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'digest/sha2'
|
3
|
-
|
4
|
-
module ProbeDockProbe
|
5
|
-
|
6
|
-
class TestPayload
|
7
|
-
|
8
|
-
class Error < ProbeDockProbe::Error; end
|
9
|
-
|
10
|
-
def initialize run
|
11
|
-
@run = run
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_h options = {}
|
15
|
-
@run.to_h options
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|