fitting 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 06220f80408936409260ab3c2ae9ec2ca4150688
4
- data.tar.gz: b47cb00f2e71872775753041f1008d4c26484e35
3
+ metadata.gz: fdb557f593641ef3769db74073ce39029981fd16
4
+ data.tar.gz: 18155ebc235d3c992c2ce2f16cef2ac3ab9f7614
5
5
  SHA512:
6
- metadata.gz: 4750c9efa6c63c0bda3895adccc1da21561905d261af985a0e4dc7fc735d1af8eb7fc76367776285b21ec2faf879a159aa4a9fe81d81bfb46d35a2a87538987b
7
- data.tar.gz: 97f88a0b890bcc70bf6ed41f2f2044007dea8b75680aaaf1fe4b883cc2d3d5b0d9e11584456179c1ef6371e66f88d7facf6ad84e37c5313783ecd0760d0cd450
6
+ metadata.gz: 102887cabc4a1b99e2214017b5e4023162a60f1e6a68ecb39c522f91b406572cc03d3217b30b26c172189d80dfb32d88b6046d8af23a106027b5e9f32512abf6
7
+ data.tar.gz: 1cf4d5d1dac4bd4c758cacfe35f12df107514b9f6cde8db62ad09a15df7519ecf562706cc83078872b5b857331c8703f4b65b19fb0ab32b3a332f8de13ddf750
data/README.md CHANGED
@@ -55,6 +55,12 @@ config.after(:each, :type => :controller) do
55
55
  end
56
56
  ```
57
57
 
58
+ ## Config
59
+
60
+ ### crash_not_implemented_response
61
+
62
+ Default true.
63
+
58
64
  ## Report
59
65
 
60
66
  Autogenerate `report_request_by_response.yaml` and `report_response.yaml reports`.
@@ -5,7 +5,6 @@ require 'fitting/documentation/request/route'
5
5
  require 'fitting/storage/responses'
6
6
  require 'fitting/storage/documentation'
7
7
  require 'fitting/storage/skip'
8
- require 'fitting/report/response'
9
8
  require 'fitting/matchers/response_matcher'
10
9
 
11
10
  module Fitting
@@ -37,18 +36,11 @@ module RSpec
37
36
  )
38
37
  request_routes = Fitting::Documentation::Request::Route.new(response_routes)
39
38
 
40
- valid_count = response_routes.coverage.size
41
- valid_percentage = response_routes.cover_ratio
42
- total_count = response_routes.all.size
43
- invalid_count = response_routes.not_coverage.size
44
- invalid_percentage = 100.0 - response_routes.cover_ratio
45
- puts "API responses conforming to the blueprint: #{valid_count} (#{valid_percentage}% of #{total_count})."
46
- puts "API responses with validation errors or untested: #{invalid_count} (#{invalid_percentage}% of #{total_count})."
47
- puts
48
- puts "Conforming responses: \n#{response_routes.coverage.join("\n")} \n\n"
49
- puts "Non-conforming responses: \n#{response_routes.not_coverage.join("\n")}\n\n"
50
- Fitting::Report::Response.new('report_response.yaml', response_routes).save
51
- Fitting::Report::Response.new('report_request_by_response.yaml', request_routes).save
39
+ request_routes.conformity_lists
40
+ request_routes.statistics
41
+ response_routes.statistics
42
+
43
+ exit if response_routes.not_coverage.present? && Fitting.configuration.crash_not_implemented_response
52
44
  end
53
45
  end
54
46
  end
@@ -1,5 +1,10 @@
1
1
  module Fitting
2
2
  class Configuration
3
- attr_accessor :tomogram
3
+ attr_accessor :tomogram,
4
+ :crash_not_implemented_response
5
+
6
+ def initialize
7
+ @crash_not_implemented_response = true
8
+ end
4
9
  end
5
10
  end
@@ -17,6 +17,8 @@ module Fitting
17
17
  stat[macro_key]['cover'] ||= []
18
18
  stat[macro_key]['not_cover'] ||= []
19
19
  stat[macro_key]['cover'].push(micro_key)
20
+ stat[macro_key]['all'] ||= []
21
+ stat[macro_key]['all'].push("✔ #{route.split(' ')[2..3].join(' ')}")
20
22
  end
21
23
  @response_routes.not_coverage.map do |route|
22
24
  macro_key = route.split(' ')[0..1].join(' ')
@@ -25,6 +27,8 @@ module Fitting
25
27
  stat[macro_key]['cover'] ||= []
26
28
  stat[macro_key]['not_cover'] ||= []
27
29
  stat[macro_key]['not_cover'].push(micro_key)
30
+ stat[macro_key]['all'] ||= []
31
+ stat[macro_key]['all'].push("✖ #{route.split(' ')[2..3].join(' ')}")
28
32
  end
29
33
  @stat = stat.inject(
30
34
  {
@@ -36,7 +40,11 @@ module Fitting
36
40
  ratio = date.last['cover_ratio'] =
37
41
  (date.last['cover'].size.to_f /
38
42
  (date.last['cover'].size + date.last['not_cover'].size).to_f * 100.0).round(2)
39
- info = {date.first => {'cover' => date.last['cover'], 'not_cover' => date.last['not_cover']}}
43
+ info = {date.first => {
44
+ 'cover' => date.last['cover'],
45
+ 'not_cover' => date.last['not_cover'],
46
+ 'all' => "#{beautiful_output(date.last)}"
47
+ }}
40
48
  if ratio == 100.0
41
49
  res['full cover'].push(info)
42
50
  elsif ratio == 0.0
@@ -44,6 +52,11 @@ module Fitting
44
52
  else
45
53
  res['partial cover'].push(info)
46
54
  end
55
+ path = date.first.split(' ')[1].size / 8
56
+ @max ||= 1
57
+ if path.size > @max
58
+ @max = path.size
59
+ end
47
60
  res
48
61
  end
49
62
  end
@@ -51,6 +64,79 @@ module Fitting
51
64
  def to_hash
52
65
  @stat ||= coverage_statistic
53
66
  end
67
+
68
+ def fully_implemented
69
+ @stat ||= coverage_statistic
70
+ @fully_implemented ||= @stat['full cover'].map do |response|
71
+ "#{response.first.to_a.first.split(' ').join("\t")}#{"\t"*(@max-response.first.to_a.first.split(' ')[1].size/8)}#{response.first.to_a.last['all']}"
72
+ end.sort do |first, second|
73
+ first.split("\t")[1] <=> second.split("\t")[1]
74
+ end
75
+ end
76
+
77
+ def partially_implemented
78
+ @stat ||= coverage_statistic
79
+ @partially_implemented ||= @stat['partial cover'].map do |response|
80
+ "#{response.first.to_a.first.split(' ').join("\t")}#{"\t"*(@max-response.first.to_a.first.split(' ')[1].size/8)}#{response.first.to_a.last['all']}"
81
+ end.sort do |first, second|
82
+ first.split("\t")[1] <=> second.split("\t")[1]
83
+ end
84
+ end
85
+
86
+ def no_implemented
87
+ @stat ||= coverage_statistic
88
+ @no_implemented ||= @stat['no cover'].map do |response|
89
+ "#{response.first.to_a.first.split(' ').join("\t")}#{"\t"*(@max-response.first.to_a.first.split(' ')[1].size/8)}#{response.first.to_a.last['all']}"
90
+ end.sort do |first, second|
91
+ first.split("\t")[1] <=> second.split("\t")[1]
92
+ end
93
+ end
94
+
95
+ def conformity_lists
96
+ puts "Conforming requests: \n#{fully_implemented.join("\n")}"
97
+ puts
98
+ puts "Partially conforming requests: \n#{partially_implemented.join("\n")}"
99
+ puts
100
+ puts "Non-conforming requests: \n#{no_implemented.join("\n")}"
101
+ puts
102
+ end
103
+
104
+ def statistics
105
+ full_count = to_hash['full cover'].size
106
+ part_count = to_hash['partial cover'].size
107
+ no_count = to_hash['no cover'].size
108
+ total_count = full_count + part_count + no_count
109
+ full_percentage = (full_count.to_f / total_count.to_f * 100.0).round(2)
110
+ part_percentage = (part_count.to_f / total_count.to_f * 100.0).round(2)
111
+ no_percentage = (no_count.to_f / total_count.to_f * 100.0).round(2)
112
+ puts "API requests with fully implemented responses: #{full_count} (#{full_percentage}% of #{total_count})."
113
+ puts "API requests with partially implemented responses: #{part_count} (#{part_percentage}% of #{total_count})."
114
+ puts "API requests with no implemented responses: #{no_count} (#{no_percentage}% of #{total_count})."
115
+ puts
116
+ end
117
+
118
+ private
119
+
120
+ def beautiful_output(hash)
121
+ methods = {}
122
+ res = []
123
+ hash['cover'].map do |response|
124
+ method, index = response.split(' ')
125
+ methods[method] ||= []
126
+ methods[method][index.to_i] = {'method' => method, 'cover' => true}
127
+ end
128
+ hash['not_cover'].map do |response|
129
+ method, index = response.split(' ')
130
+ methods[method] ||= []
131
+ methods[method][index.to_i] = {'method' => method, 'cover' => false}
132
+ end
133
+ methods.map do |method|
134
+ method.last.size.times do |index|
135
+ res.push("#{method.last[index]['cover'] ? '✔' : '✖'} #{method.first}")
136
+ end
137
+ end
138
+ res.join(' ')
139
+ end
54
140
  end
55
141
  end
56
142
  end
@@ -45,6 +45,17 @@ module Fitting
45
45
  'not coverage' => not_coverage
46
46
  }
47
47
  end
48
+
49
+ def statistics
50
+ valid_count = coverage.size
51
+ valid_percentage = cover_ratio
52
+ total_count = all.size
53
+ invalid_count = not_coverage.size
54
+ invalid_percentage = 100.0 - cover_ratio
55
+ puts "API responses conforming to the blueprint: #{valid_count} (#{valid_percentage}% of #{total_count})."
56
+ puts "API responses with validation errors or untested: #{invalid_count} (#{invalid_percentage}% of #{total_count})."
57
+ puts
58
+ end
48
59
  end
49
60
  end
50
61
  end
@@ -1,3 +1,3 @@
1
1
  module Fitting
2
- VERSION = '1.1.0'.freeze
2
+ VERSION = '1.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fitting
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - d.efimov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-03-01 00:00:00.000000000 Z
11
+ date: 2017-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json-schema
@@ -195,7 +195,6 @@ files:
195
195
  - lib/fitting/documentation/request/route.rb
196
196
  - lib/fitting/documentation/response/route.rb
197
197
  - lib/fitting/matchers/response_matcher.rb
198
- - lib/fitting/report/response.rb
199
198
  - lib/fitting/request.rb
200
199
  - lib/fitting/response.rb
201
200
  - lib/fitting/storage/documentation.rb
@@ -1,18 +0,0 @@
1
- require 'yaml'
2
-
3
- module Fitting
4
- module Report
5
- class Response
6
- def initialize(name, routes)
7
- @name = name
8
- @json = routes.to_hash
9
- end
10
-
11
- def save
12
- File.open(@name, 'w') do |file|
13
- file.write(YAML.dump(@json))
14
- end
15
- end
16
- end
17
- end
18
- end