airborne_report 0.1.0 → 0.2.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: 341027d5bc0c0b14f5909a55dd9ace77581024d6
4
- data.tar.gz: a770921562e20a30f7872d40e83fd3e9fd61f352
3
+ metadata.gz: ed1c7456a4dd13090a4dae8e93b9f9a59ae4d36e
4
+ data.tar.gz: 9539721512253d96189ec9b90c7c77cd1d8bca4f
5
5
  SHA512:
6
- metadata.gz: 8133f68adb5098ca288636bfa374a2dd477753c5e19c64e516766125e680485b39bd41733e47419cfef9de770995ed3b3540b9b51cb56627bcb7a57d4661e8cc
7
- data.tar.gz: 4b9ee896cb80975d0183d6f917955188e1eb0b16671a65be2ff9c16e28a9be14543dc6c127502381e146b7746cca5a4633c0fc97d0e7eb142aa61ffe14949b3a
6
+ metadata.gz: 98a06ab9ea2344fa44e1d15bed80a72d7b756264b5ac1e36a1204a4dddab66fa58ac678e0e2a177388bb453fb6cf79cea89aaf1550879380ab2b893b5912c295
7
+ data.tar.gz: 8209349b2f1406fb7c2109e732291d4358b6d2902b5ee4c7f733abc4987d72bfb3db1e9c43465e52d80f13eadd74dc907ecfa7a96a4e1a04129c97aa50545335
data/.gitignore CHANGED
@@ -11,4 +11,3 @@
11
11
  report.html
12
12
  report.json
13
13
  .byebug_history
14
- storage.json
data/README.md CHANGED
@@ -22,7 +22,7 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- ```
25
+ ```ruby
26
26
  # spec/spec_helper.rb
27
27
  require 'airborne_report'
28
28
  ```
@@ -29,4 +29,6 @@ Gem::Specification.new do |spec|
29
29
  spec.add_development_dependency 'bundler'
30
30
  spec.add_development_dependency 'rake'
31
31
  spec.add_development_dependency 'rspec'
32
+ spec.add_development_dependency 'simplecov'
33
+ spec.add_development_dependency 'byebug'
32
34
  end
@@ -1,5 +1,6 @@
1
1
  require 'airborne_report/version'
2
2
  require 'airborne_report/message'
3
+ require 'airborne_report/storage/tests'
3
4
 
4
5
  module AirborneReport
5
6
  end
@@ -29,18 +30,14 @@ module Airborne
29
30
 
30
31
  def full_save(response)
31
32
  request = response.request
32
- AirborneReport::JsonFile.push(
33
- location,
34
- AirborneReport::Message.full(request, response).to_hash
35
- )
33
+ AirborneReport::Storage::Tests.find_or_create(location)
34
+ .push(AirborneReport::Message.full(request, response).to_hash)
36
35
  end
37
36
 
38
37
  def wasted_save(args, response)
39
38
  url = get_url(args[1])
40
- AirborneReport::JsonFile.push(
41
- location,
42
- AirborneReport::Message.wasted(args, response, url).to_hash
43
- )
39
+ AirborneReport::Storage::Tests.find_or_create(location)
40
+ .push(AirborneReport::Message.wasted(args, response, url).to_hash)
44
41
  end
45
42
 
46
43
  def location
@@ -1,5 +1,4 @@
1
1
  require 'multi_json'
2
- require 'airborne_report/json_file'
3
2
 
4
3
  module AirborneReport
5
4
  class Message
@@ -10,30 +9,36 @@ module AirborneReport
10
9
  def self.full(request, response)
11
10
  new(
12
11
  'time' => Time.now,
13
- 'request' => {
14
- 'method' => request.method,
15
- 'url' => request.url,
16
- 'headers' => request.headers,
17
- 'body' => request.args
18
- },
19
12
  'response' => {
20
13
  'headers' => response.headers,
21
- 'body' => MultiJson.load(response)
14
+ 'body' => load_response(response),
15
+ 'request' => {
16
+ 'method' => request.method,
17
+ 'url' => request.url,
18
+ 'headers' => request.headers,
19
+ 'body' => request.args[:payload]
20
+ }
22
21
  }
23
22
  )
24
23
  end
25
24
 
25
+ def self.load_response(response)
26
+ MultiJson.load(response)
27
+ rescue MultiJson::ParseError
28
+ response
29
+ end
30
+
26
31
  def self.wasted(args, response, url)
27
32
  new(
28
33
  'time' => Time.now,
29
- 'request' => {
30
- 'method' => args[0],
31
- 'url' => url,
32
- 'headers' => args[2][:headers],
33
- 'body' => args[2][:body]
34
- },
35
34
  'response' => {
36
- 'body' => response
35
+ 'body' => response,
36
+ 'request' => {
37
+ 'method' => args[0],
38
+ 'url' => url,
39
+ 'headers' => args[2][:headers],
40
+ 'body' => args[2][:body]
41
+ }
37
42
  }
38
43
  )
39
44
  end
@@ -11,7 +11,18 @@ module AirborneReport
11
11
 
12
12
  notification.examples.map do |example|
13
13
  location = example.metadata[:location]
14
- after_json[location] = craft_example(before_json, location, example)
14
+
15
+ hash = {}
16
+ e = example.exception
17
+ if e
18
+ hash['exception'] = {
19
+ 'class' => e.class.name,
20
+ 'message' => e.message,
21
+ 'backtrace' => e.backtrace,
22
+ }
23
+ end
24
+
25
+ after_json[location] = craft_example(before_json, location, example).merge(hash)
15
26
  statuses = increment_statuses(statuses, example)
16
27
  end
17
28
 
@@ -35,7 +46,7 @@ module AirborneReport
35
46
 
36
47
  def craft_example(before_json, location, example)
37
48
  if before_json[location]
38
- Message.extra(example).to_hash.merge(before_json[location])
49
+ Message.extra(example).to_hash.merge('responses' => before_json[location])
39
50
  else
40
51
  Message.extra(example).to_hash
41
52
  end
@@ -1,19 +1,14 @@
1
1
  require 'rspec/core/formatters/base_formatter'
2
2
  require 'haml'
3
- require 'airborne_report/json_file'
4
3
  require 'airborne_report/report'
4
+ require 'airborne_report/storage/tests'
5
5
 
6
6
  module AirborneReport
7
7
  class RspecHtmlFormatter < RSpec::Core::Formatters::BaseFormatter
8
- RSpec::Core::Formatters.register self, :start, :stop
9
-
10
- def start(_notification)
11
- AirborneReport::JsonFile.save(Report.blank)
12
- end
8
+ RSpec::Core::Formatters.register self, :stop
13
9
 
14
10
  def stop(notification)
15
- tests = AirborneReport::JsonFile.tests
16
- AirborneReport::JsonFile.destroy
11
+ tests = AirborneReport::Storage::Tests.all
17
12
 
18
13
  report = Report.new(tests, notification).to_hash
19
14
  craft_html(report)
@@ -1,19 +1,14 @@
1
1
  require 'rspec/core/formatters/base_formatter'
2
2
  require 'multi_json'
3
- require 'airborne_report/json_file'
4
3
  require 'airborne_report/report'
4
+ require 'airborne_report/storage/tests'
5
5
 
6
6
  module AirborneReport
7
7
  class RspecJsonFormatter < RSpec::Core::Formatters::BaseFormatter
8
- RSpec::Core::Formatters.register self, :start, :stop
9
-
10
- def start(_notification)
11
- AirborneReport::JsonFile.save(Report.blank)
12
- end
8
+ RSpec::Core::Formatters.register self, :stop
13
9
 
14
10
  def stop(notification)
15
- tests = AirborneReport::JsonFile.tests
16
- AirborneReport::JsonFile.destroy
11
+ tests = AirborneReport::Storage::Tests.all
17
12
 
18
13
  report = Report.new(tests, notification).to_hash
19
14
  craft_json(report)
@@ -0,0 +1,20 @@
1
+ module AirborneReport
2
+ module Storage
3
+ module Tests
4
+ class << self
5
+ def find_or_create(location)
6
+ @tests ||= {}
7
+ unless @tests[location]
8
+ @tests[location] = []
9
+ end
10
+ @tests[location]
11
+ end
12
+
13
+ def all
14
+ @tests ||= {}
15
+ @tests
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,3 +1,3 @@
1
1
  module AirborneReport
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
@@ -21,63 +21,56 @@
21
21
  %details
22
22
  %summary{class: "collapse #{example.last['status']}"}
23
23
  = example.last['full_description']
24
- %div
24
+ %div{class: 'group'}
25
25
  %div{class: 'section'}
26
- - if example.last['request'] && example.last['response']['body']
27
26
  %div
28
27
  %b path:
29
28
  = example.first
30
- %div
31
- %b time:
32
- = example.last['time']
33
- %div{class: 'section'}
34
- %div
35
- %b request.method:
36
- = example.last['request']['method']
37
- %div
38
- %b request.url:
39
- = example.last['request']['url']
40
- %div
41
- %b request.headers:
42
- = example.last['request']['headers']
43
- %div
44
- %b request.body:
45
- %xmp
46
- = example.last['request']['body']
47
- %div{class: 'section'}
48
- %div
49
- %b response.headers:
50
- = example.last['response']['headers']
51
- %div
52
- %b response.body:
53
- %xmp
54
- = example.last['response']['body']
55
- - elsif example.last['request']
56
- %div
57
- %b path:
58
- = example.first
59
- %div{class: 'section'}
29
+
30
+ - if example.last['responses']
31
+ - example.last['responses'].each do |response|
32
+ %div{class: 'group'}
33
+ - if response['response'] && response['response']['request']
34
+ %div{class: 'section'}
35
+ %div
36
+ %b request.time:
37
+ = response['time']
38
+ %div
39
+ %b request.method:
40
+ = response['response']['request']['method']
41
+ %div
42
+ %b request.url:
43
+ = response['response']['request']['url']
44
+ %div
45
+ %b request.headers:
46
+ = response['response']['request']['headers']
47
+ %div
48
+ %b request.body:
49
+ %xmp
50
+ =response['response']['request']['body']
51
+ - if response['response']
52
+ %div{class: 'section'}
53
+ %div
54
+ %b response.headers:
55
+ = response['response']['headers']
56
+ %div
57
+ %b response.body:
58
+ %xmp
59
+ = response['response']['body']
60
+
61
+ - if example.last['exception']
62
+
63
+ %details
64
+ %summary{class: "collapse"}
65
+ = 'exception'
60
66
  %div
61
- %b request.method:
62
- = example.last['request']['method']
63
- %div
64
- %b request.url:
65
- = example.last['request']['url']
66
- %div
67
- %b request.headers:
68
- = example.last['request']['headers']
69
- %div
70
- %b request.body:
71
- = example.last['request']['body']
72
- %div{class: 'section'}
73
- %div
74
- Request failed
75
- - elsif example.last['status'] == 'pending'
76
- %div
77
- %b path:
78
- = example.first
79
- - else
80
- %div
81
- %b path:
82
- = example.first
83
- Test failed
67
+ %div{class: 'group section'}
68
+ %div
69
+ %b exception.class:
70
+ = example.last['exception']['class']
71
+ %div
72
+ %b exception.message:
73
+ = example.last['exception']['message']
74
+ %div
75
+ %b exception.backtrace:
76
+ = example.last['exception']['backtrace']
@@ -39,3 +39,9 @@ summary:hover {
39
39
  .section {
40
40
  padding-top: 10px;
41
41
  }
42
+
43
+ .group {
44
+ border: 1px solid black;
45
+ margin: 5px 0px;
46
+ padding: 0px 5px;
47
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airborne_report
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Efimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-25 00:00:00.000000000 Z
11
+ date: 2017-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: airborne
@@ -94,6 +94,34 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
97
125
  description: This gem gives you RSpec formatters which let you generate HTML and JSON
98
126
  reports if you use the airborne gem for your integration tests.
99
127
  email:
@@ -112,11 +140,11 @@ files:
112
140
  - bin/console
113
141
  - bin/setup
114
142
  - lib/airborne_report.rb
115
- - lib/airborne_report/json_file.rb
116
143
  - lib/airborne_report/message.rb
117
144
  - lib/airborne_report/report.rb
118
145
  - lib/airborne_report/rspec_html_formatter.rb
119
146
  - lib/airborne_report/rspec_json_formatter.rb
147
+ - lib/airborne_report/storage/tests.rb
120
148
  - lib/airborne_report/version.rb
121
149
  - lib/airborne_report/view/report.html.haml
122
150
  - lib/airborne_report/view/style.css
@@ -1,25 +0,0 @@
1
- require 'multi_json'
2
-
3
- module AirborneReport
4
- class JsonFile
5
- NAME = 'storage.json'.freeze
6
-
7
- def self.save(json)
8
- File.open(NAME, 'w') do |file|
9
- file.write(MultiJson.dump(json))
10
- end
11
- end
12
-
13
- def self.push(key, value)
14
- save('tests' => tests.merge(key => value))
15
- end
16
-
17
- def self.tests
18
- MultiJson.load(File.read(NAME))['tests']
19
- end
20
-
21
- def self.destroy
22
- File.delete(NAME)
23
- end
24
- end
25
- end