data_harvester 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 +7 -0
- data/Gemfile +3 -0
- data/Rakefile +0 -0
- data/VERSION +1 -0
- data/lib/data_harvester.rb +52 -0
- data/spec/data_harvester_spec.rb +78 -0
- metadata +176 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: fea1b628d5599ddc3521afa2e239fbd25ef83706
|
|
4
|
+
data.tar.gz: c756143994090ba4dbc968cbc2d98eeee519ec15
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: a0f455eea6b5edc320fd46ae4b5cce87ed04870e359a10b94e0babc34248440fd508e55dfcda0b9ae5daf93c9923373257ddca2e5ce633d4fcbde7ef66368acd
|
|
7
|
+
data.tar.gz: 49e85f5bd472599a71d5a8b93b2ef087a5cb89104c59d8fce88337bc76823e1cb7cdb2972c5c8df4a52aaa9bd91dfaa4e3210b525f0d2d432e8c1caf32e457c6
|
data/Gemfile
ADDED
data/Rakefile
ADDED
|
File without changes
|
data/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.1
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'influxdb'
|
|
4
|
+
require 'concurrent/promise'
|
|
5
|
+
|
|
6
|
+
# DataHarvester sends rspec result data to a database (InfluxDB)
|
|
7
|
+
# Allows aggregating the results of Rspec tests in one location.
|
|
8
|
+
class DataHarvester
|
|
9
|
+
attr_reader :database_client
|
|
10
|
+
|
|
11
|
+
def initialize(database: 'master', host: '127.0.0.1')
|
|
12
|
+
@database_client = InfluxDB::Client.new database: database,
|
|
13
|
+
host: host,
|
|
14
|
+
time_precision: 'u'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def generate_payload(example, extra_data: nil, tags: nil)
|
|
18
|
+
# Rspec status is populated when the rspec after hooks complete, wait until then
|
|
19
|
+
Timeout.timeout(5) { sleep 0.0001 while example.execution_result.status.nil? }
|
|
20
|
+
|
|
21
|
+
data = default_data(example)
|
|
22
|
+
data[:values].merge! extra_data if extra_data
|
|
23
|
+
data[:tags] = tags if tags
|
|
24
|
+
data
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def queue_send_data(example, series: 'test_results', extra_data: nil, tags: nil)
|
|
28
|
+
Concurrent::Promise.execute { send_data(example, series, extra_data: extra_data, tags: tags) }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def default_data(example)
|
|
34
|
+
{
|
|
35
|
+
values: { duration: example.execution_result.run_time,
|
|
36
|
+
result: example.execution_result.status.to_s,
|
|
37
|
+
name: example.metadata[:full_description],
|
|
38
|
+
source_environment: source_environment }
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def send_data(example, series, extra_data: nil, tags: nil)
|
|
43
|
+
return if source_environment == 'bitbucket'
|
|
44
|
+
|
|
45
|
+
data = generate_payload(example, extra_data: extra_data, tags: tags)
|
|
46
|
+
@database_client.write_point(series, data)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def source_environment
|
|
50
|
+
ENV['source_environment'] ||= 'local'
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'data_harvester'
|
|
4
|
+
require 'rspec/eventually'
|
|
5
|
+
require 'webmock/rspec'
|
|
6
|
+
|
|
7
|
+
describe DataHarvester do
|
|
8
|
+
subject(:harvester) { described_class.new }
|
|
9
|
+
|
|
10
|
+
let(:current_example) do
|
|
11
|
+
metadata = {
|
|
12
|
+
description: 'can send test data',
|
|
13
|
+
full_description: 'DataHarvester can send test data',
|
|
14
|
+
file_path: './spec/data_harvester_spec.rb',
|
|
15
|
+
line_number: 26,
|
|
16
|
+
location: './spec/data_harvester_spec.rb:26',
|
|
17
|
+
absolute_file_path: '/Development/spec/data_harvester_spec.rb',
|
|
18
|
+
rerun_file_path: './spec/data_harvester_spec.rb',
|
|
19
|
+
last_run_status: 'passed'
|
|
20
|
+
}
|
|
21
|
+
current_example = RSpec.current_example
|
|
22
|
+
metadata.each do |key, value|
|
|
23
|
+
current_example.metadata[key] = value
|
|
24
|
+
end
|
|
25
|
+
current_example.execution_result.status = 'passed'
|
|
26
|
+
current_example
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
before do
|
|
30
|
+
stub_request(:any, '127.0.0.1')
|
|
31
|
+
query = { db: 'master', p: 'root', precision: 'u', u: 'root' }
|
|
32
|
+
body = 'test_results duration=,result="passed",'
|
|
33
|
+
body += 'name="DataHarvester can send test data",source_environment="local"'
|
|
34
|
+
@request = a_request(:post, '127.0.0.1:8086/write').with(body: body, query: query)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'can send test data' do
|
|
38
|
+
harvester.queue_send_data(current_example)
|
|
39
|
+
# Need to find out what expectation to check here
|
|
40
|
+
expect { @request }.to eventually(have_been_made.once).within 2
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context 'can be customized' do
|
|
44
|
+
subject(:custom_database_harvester) { described_class.new database: 'test_run_results' }
|
|
45
|
+
|
|
46
|
+
before do
|
|
47
|
+
query = { db: 'test_run_results', p: 'root', precision: 'u', u: 'root' }
|
|
48
|
+
body = 'test_results duration=,result="passed",'
|
|
49
|
+
body += 'name="DataHarvester can send test data",source_environment="local"'
|
|
50
|
+
@request = a_request(:post, '127.0.0.1:8086/write').with(body: body, query: query)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'to use a different database' do
|
|
54
|
+
custom_database_harvester.queue_send_data(current_example)
|
|
55
|
+
expect { @request }.to eventually(have_been_made.once).within 2
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'generates payload that includes full description' do
|
|
60
|
+
data = harvester.generate_payload(current_example)
|
|
61
|
+
expect(data[:values][:name]).to eq 'DataHarvester can send test data'
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'supports custom data in the payload' do
|
|
65
|
+
query = { db: 'master', p: 'root', precision: 'u', u: 'root' }
|
|
66
|
+
body = 'test_results duration=,result="passed",'
|
|
67
|
+
body += 'name="DataHarvester can send test data",source_environment="local"'
|
|
68
|
+
body += ',custom_field="custom_data"'
|
|
69
|
+
request = a_request(:post, '127.0.0.1:8086/write').with(body: body, query: query)
|
|
70
|
+
|
|
71
|
+
custom_data = {
|
|
72
|
+
custom_field: 'custom_data'
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
harvester.queue_send_data(current_example, extra_data: custom_data)
|
|
76
|
+
expect { request }.to eventually(have_been_made.once).within 2
|
|
77
|
+
end
|
|
78
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: data_harvester
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Felix Barros
|
|
8
|
+
- Tom Mason
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2018-08-04 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: bundler
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - "~>"
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '1.3'
|
|
21
|
+
type: :development
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - "~>"
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: '1.3'
|
|
28
|
+
- !ruby/object:Gem::Dependency
|
|
29
|
+
name: rake
|
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
|
31
|
+
requirements:
|
|
32
|
+
- - "~>"
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: '12.3'
|
|
35
|
+
- - ">="
|
|
36
|
+
- !ruby/object:Gem::Version
|
|
37
|
+
version: 12.3.1
|
|
38
|
+
type: :development
|
|
39
|
+
prerelease: false
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
requirements:
|
|
42
|
+
- - "~>"
|
|
43
|
+
- !ruby/object:Gem::Version
|
|
44
|
+
version: '12.3'
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 12.3.1
|
|
48
|
+
- !ruby/object:Gem::Dependency
|
|
49
|
+
name: rspec
|
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '3.6'
|
|
55
|
+
type: :development
|
|
56
|
+
prerelease: false
|
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '3.6'
|
|
62
|
+
- !ruby/object:Gem::Dependency
|
|
63
|
+
name: rubocop
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0.49'
|
|
69
|
+
type: :development
|
|
70
|
+
prerelease: false
|
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0.49'
|
|
76
|
+
- !ruby/object:Gem::Dependency
|
|
77
|
+
name: webmock
|
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '3.0'
|
|
83
|
+
type: :development
|
|
84
|
+
prerelease: false
|
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '3.0'
|
|
90
|
+
- !ruby/object:Gem::Dependency
|
|
91
|
+
name: concurrent-ruby
|
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '1.0'
|
|
97
|
+
- - ">="
|
|
98
|
+
- !ruby/object:Gem::Version
|
|
99
|
+
version: 1.0.5
|
|
100
|
+
type: :runtime
|
|
101
|
+
prerelease: false
|
|
102
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
103
|
+
requirements:
|
|
104
|
+
- - "~>"
|
|
105
|
+
- !ruby/object:Gem::Version
|
|
106
|
+
version: '1.0'
|
|
107
|
+
- - ">="
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: 1.0.5
|
|
110
|
+
- !ruby/object:Gem::Dependency
|
|
111
|
+
name: influxdb
|
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - "~>"
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: 0.6.0
|
|
117
|
+
type: :runtime
|
|
118
|
+
prerelease: false
|
|
119
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - "~>"
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: 0.6.0
|
|
124
|
+
- !ruby/object:Gem::Dependency
|
|
125
|
+
name: rspec-eventually
|
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: 0.2.2
|
|
131
|
+
type: :runtime
|
|
132
|
+
prerelease: false
|
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - "~>"
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: 0.2.2
|
|
138
|
+
description:
|
|
139
|
+
email:
|
|
140
|
+
- felix.barros@finalsite.com
|
|
141
|
+
- tom.mason@finalsite.com
|
|
142
|
+
executables: []
|
|
143
|
+
extensions: []
|
|
144
|
+
extra_rdoc_files: []
|
|
145
|
+
files:
|
|
146
|
+
- Gemfile
|
|
147
|
+
- Rakefile
|
|
148
|
+
- VERSION
|
|
149
|
+
- lib/data_harvester.rb
|
|
150
|
+
- spec/data_harvester_spec.rb
|
|
151
|
+
homepage: https://finalsite.com/
|
|
152
|
+
licenses:
|
|
153
|
+
- MIT
|
|
154
|
+
metadata: {}
|
|
155
|
+
post_install_message:
|
|
156
|
+
rdoc_options: []
|
|
157
|
+
require_paths:
|
|
158
|
+
- lib
|
|
159
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
160
|
+
requirements:
|
|
161
|
+
- - ">="
|
|
162
|
+
- !ruby/object:Gem::Version
|
|
163
|
+
version: 2.2.0
|
|
164
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
|
+
requirements:
|
|
166
|
+
- - ">="
|
|
167
|
+
- !ruby/object:Gem::Version
|
|
168
|
+
version: '0'
|
|
169
|
+
requirements: []
|
|
170
|
+
rubyforge_project:
|
|
171
|
+
rubygems_version: 2.6.14
|
|
172
|
+
signing_key:
|
|
173
|
+
specification_version: 4
|
|
174
|
+
summary: Allows aggregating results of Rspec tests in one location
|
|
175
|
+
test_files:
|
|
176
|
+
- spec/data_harvester_spec.rb
|