data_harvester 0.1.1

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: fea1b628d5599ddc3521afa2e239fbd25ef83706
4
+ data.tar.gz: c756143994090ba4dbc968cbc2d98eeee519ec15
5
+ SHA512:
6
+ metadata.gz: a0f455eea6b5edc320fd46ae4b5cce87ed04870e359a10b94e0babc34248440fd508e55dfcda0b9ae5daf93c9923373257ddca2e5ce633d4fcbde7ef66368acd
7
+ data.tar.gz: 49e85f5bd472599a71d5a8b93b2ef087a5cb89104c59d8fce88337bc76823e1cb7cdb2972c5c8df4a52aaa9bd91dfaa4e3210b525f0d2d432e8c1caf32e457c6
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
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