fitting 2.11.0 → 2.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +0 -1
- data/.rubocop.yml +1 -1
- data/.ruby-version +1 -1
- data/.tool-versions +1 -0
- data/.travis.yml +1 -1
- data/CHANGELOG.md +47 -0
- data/README.md +136 -76
- data/fitting.gemspec +1 -1
- data/lib/fitting.rb +5 -0
- data/lib/fitting/cover/json_schema.rb +21 -80
- data/lib/fitting/cover/json_schema_enum.rb +20 -70
- data/lib/fitting/cover/json_schema_one_of.rb +38 -0
- data/lib/fitting/records/spherical/requests.rb +3 -1
- data/lib/fitting/records/unit/json_schema.rb +26 -0
- data/lib/fitting/report/action.rb +53 -0
- data/lib/fitting/report/actions.rb +55 -0
- data/lib/fitting/report/combination.rb +37 -0
- data/lib/fitting/report/combinations.rb +47 -0
- data/lib/fitting/report/console.rb +41 -0
- data/lib/fitting/report/prefix.rb +53 -0
- data/lib/fitting/report/prefixes.rb +44 -0
- data/lib/fitting/report/response.rb +71 -0
- data/lib/fitting/report/responses.rb +48 -0
- data/lib/fitting/report/test.rb +61 -0
- data/lib/fitting/report/tests.rb +62 -0
- data/lib/fitting/statistics/cover_error_one_of.rb +27 -0
- data/lib/fitting/statistics/list.rb +2 -0
- data/lib/fitting/statistics/measurement_cover_one_of.rb +92 -0
- data/lib/fitting/statistics/template.rb +5 -0
- data/lib/fitting/statistics/template_cover_error_one_of.rb +50 -0
- data/lib/fitting/tests.rb +0 -1
- data/lib/fitting/version.rb +1 -1
- data/lib/tasks/fitting.rake +150 -2
- data/lib/templates/bomboniere/.gitignore +21 -0
- data/lib/templates/bomboniere/.tool-versions +1 -0
- data/lib/templates/bomboniere/README.md +19 -0
- data/lib/templates/bomboniere/dist/css/app.62e086ac.css +1 -0
- data/lib/templates/bomboniere/dist/css/chunk-vendors.ec5f6c3f.css +1 -0
- data/lib/templates/bomboniere/dist/favicon.ico +0 -0
- data/lib/templates/bomboniere/dist/index.html +1 -0
- data/lib/templates/bomboniere/dist/js/app.4356d509.js +2 -0
- data/lib/templates/bomboniere/dist/js/app.4356d509.js.map +1 -0
- data/lib/templates/bomboniere/dist/js/chunk-vendors.90aeb613.js +13 -0
- data/lib/templates/bomboniere/dist/js/chunk-vendors.90aeb613.js.map +1 -0
- data/lib/templates/bomboniere/package-lock.json +9263 -0
- data/lib/templates/bomboniere/package.json +25 -0
- data/lib/templates/bomboniere/public/favicon.ico +0 -0
- data/lib/templates/bomboniere/public/index.html +17 -0
- data/lib/templates/bomboniere/src/App.vue +102 -0
- data/lib/templates/bomboniere/src/assets/logo.png +0 -0
- data/lib/templates/bomboniere/src/components/HelloWorld.vue +188 -0
- data/lib/templates/bomboniere/src/main.js +10 -0
- data/lib/templates/bomboniere/src/router/index.js +31 -0
- data/lib/templates/bomboniere/src/views/About.vue +5 -0
- data/lib/templates/bomboniere/src/views/Action.vue +154 -0
- data/lib/templates/bomboniere/src/views/Home.vue +17 -0
- data/lib/templates/bomboniere/vue.config.js +3 -0
- metadata +47 -8
@@ -0,0 +1,27 @@
|
|
1
|
+
module Fitting
|
2
|
+
class Statistics
|
3
|
+
class CoverErrorOneOf
|
4
|
+
def initialize(request_unit)
|
5
|
+
@request_unit = request_unit
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_s
|
9
|
+
res = ''
|
10
|
+
@request_unit.map do |request|
|
11
|
+
request.responses.map do |response|
|
12
|
+
next unless response.tested_bodies != []
|
13
|
+
response.json_schemas.map do |json_schema|
|
14
|
+
json_schema.combinations_with_one_of.map do |combination|
|
15
|
+
next unless combination.valid_bodies == []
|
16
|
+
res += "request method: #{request.method}\nrequest path: #{request.path}\n"\
|
17
|
+
"response status: #{response.status}\nsource json-schema: #{json_schema.json_schema}\n"\
|
18
|
+
"combination: #{combination.description}\nnew json-schema: #{combination.json_schema}\n\n"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
res
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -45,6 +45,8 @@ module Fitting
|
|
45
45
|
res.push("#{json_schema.cover}% #{response.status}")
|
46
46
|
elsif @depth == 'cover_enum'
|
47
47
|
res.push("#{json_schema.cover_enum}% #{response.status}")
|
48
|
+
elsif @depth == 'cover_one_of'
|
49
|
+
res.push("#{json_schema.cover_one_of}% #{response.status}")
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Fitting
|
2
|
+
class Statistics
|
3
|
+
class MeasurementCoverOneOf
|
4
|
+
attr_reader :requests, :all_responses, :cover_responses, :not_cover_responses, :max_response_path,
|
5
|
+
:coverage_fully, :coverage_non, :coverage_partially, :not_covered_responses
|
6
|
+
|
7
|
+
def initialize(requests)
|
8
|
+
@requests = requests
|
9
|
+
@all_responses = 0
|
10
|
+
@cover_responses = 0
|
11
|
+
@not_cover_responses = 0
|
12
|
+
@max_response_path = 0
|
13
|
+
@coverage_fully = []
|
14
|
+
@coverage_non = []
|
15
|
+
@coverage_partially = []
|
16
|
+
@not_covered_responses = []
|
17
|
+
check_responses
|
18
|
+
end
|
19
|
+
|
20
|
+
def check_responses
|
21
|
+
return if @ready
|
22
|
+
|
23
|
+
@requests.map do |request|
|
24
|
+
chech_request(request)
|
25
|
+
end
|
26
|
+
|
27
|
+
@ready = true
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def chech_request(request)
|
33
|
+
check_cover(request)
|
34
|
+
coverage_push(request)
|
35
|
+
|
36
|
+
@max_response_path = request.path.to_s.size / 8 if request.path.to_s.size / 8 > @max_response_path
|
37
|
+
request.responses.map do |response|
|
38
|
+
check_response(response, request)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def check_response(response, request)
|
43
|
+
json_schema_index = 0
|
44
|
+
response.json_schemas.map do |json_schema|
|
45
|
+
json_schema_index = check_json_schema(json_schema, request, response, json_schema_index)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def check_json_schema(json_schema, request, response, json_schema_index)
|
50
|
+
if json_schema.cover_one_of != 100
|
51
|
+
@not_cover_responses += 1
|
52
|
+
@not_covered_responses.push("#{request.method}\t#{request.path} #{response.status} #{json_schema_index}")
|
53
|
+
else
|
54
|
+
@cover_responses += 1
|
55
|
+
end
|
56
|
+
@all_responses += 1
|
57
|
+
json_schema_index + 1
|
58
|
+
end
|
59
|
+
|
60
|
+
def coverage_push(request)
|
61
|
+
if @all == @cover
|
62
|
+
@coverage_fully.push(request)
|
63
|
+
elsif @all == @not_cover
|
64
|
+
@coverage_non.push(request)
|
65
|
+
else
|
66
|
+
@coverage_partially.push(request)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def check_cover(request)
|
71
|
+
@all = 0
|
72
|
+
@cover = 0
|
73
|
+
@not_cover = 0
|
74
|
+
|
75
|
+
request.responses.map do |response|
|
76
|
+
response.json_schemas.map do |json_schema|
|
77
|
+
count_cover(json_schema)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def count_cover(json_schema)
|
83
|
+
@all += 1
|
84
|
+
if json_schema.cover_one_of != 100
|
85
|
+
@not_cover += 1
|
86
|
+
else
|
87
|
+
@cover += 1
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -3,6 +3,7 @@ require 'fitting/statistics/analysis'
|
|
3
3
|
require 'fitting/statistics/measurement'
|
4
4
|
require 'fitting/statistics/measurement_cover'
|
5
5
|
require 'fitting/statistics/measurement_cover_enum'
|
6
|
+
require 'fitting/statistics/measurement_cover_one_of'
|
6
7
|
require 'fitting/records/unit/request'
|
7
8
|
require 'fitting/storage/white_list'
|
8
9
|
require 'fitting/records/documented/request'
|
@@ -53,6 +54,8 @@ module Fitting
|
|
53
54
|
Fitting::Statistics::MeasurementCover.new(white_unit)
|
54
55
|
elsif @depth == 'cover_enum'
|
55
56
|
Fitting::Statistics::MeasurementCoverEnum.new(white_unit)
|
57
|
+
elsif @depth == 'cover_one_of'
|
58
|
+
Fitting::Statistics::MeasurementCoverOneOf.new(white_unit)
|
56
59
|
end
|
57
60
|
end
|
58
61
|
|
@@ -64,6 +67,8 @@ module Fitting
|
|
64
67
|
Fitting::Statistics::MeasurementCover.new(black_unit)
|
65
68
|
elsif @depth == 'cover_enum'
|
66
69
|
Fitting::Statistics::MeasurementCoverEnum.new(black_unit)
|
70
|
+
elsif @depth == 'cover_one_of'
|
71
|
+
Fitting::Statistics::MeasurementCoverOneOf.new(black_unit)
|
67
72
|
end
|
68
73
|
end
|
69
74
|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'fitting/statistics/cover_error_one_of'
|
2
|
+
require 'fitting/records/unit/request'
|
3
|
+
require 'fitting/storage/white_list'
|
4
|
+
require 'fitting/records/documented/request'
|
5
|
+
|
6
|
+
module Fitting
|
7
|
+
class Statistics
|
8
|
+
class TemplateCoverErrorOneOf
|
9
|
+
def initialize(tested_requests, config)
|
10
|
+
@tested_requests = tested_requests
|
11
|
+
@config = config
|
12
|
+
end
|
13
|
+
|
14
|
+
def stats
|
15
|
+
"#{white_statistics}\n\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
def white_statistics
|
19
|
+
@white_statistics ||= Fitting::Statistics::CoverErrorOneOf.new(white_unit)
|
20
|
+
end
|
21
|
+
|
22
|
+
def white_unit
|
23
|
+
@white_unit_requests ||= documented_requests_white.inject([]) do |res, documented_request|
|
24
|
+
res.push(Fitting::Records::Unit::Request.new(documented_request, @tested_requests))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def documented_requests_white
|
29
|
+
@documented_requests_white ||= documented.find_all(&:white)
|
30
|
+
end
|
31
|
+
|
32
|
+
def documented
|
33
|
+
@documented_requests ||= @config.tomogram.to_a.inject([]) do |res, tomogram_request|
|
34
|
+
res.push(Fitting::Records::Documented::Request.new(tomogram_request, white_list.to_a))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def white_list
|
39
|
+
@white_list ||= Fitting::Storage::WhiteList.new(
|
40
|
+
@config.prefix,
|
41
|
+
@config.white_list,
|
42
|
+
@config.resource_white_list,
|
43
|
+
@config.include_resources,
|
44
|
+
@config.include_actions,
|
45
|
+
@config.tomogram.to_resources
|
46
|
+
)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/fitting/tests.rb
CHANGED
@@ -9,7 +9,6 @@ module Fitting
|
|
9
9
|
def save
|
10
10
|
make_dir('fitting_tests')
|
11
11
|
array = @tested_requests.inject([]) do |res, request|
|
12
|
-
next res unless request.path.to_s.start_with?(Fitting.configuration.prefix)
|
13
12
|
res.push(request.to_spherical.to_hash)
|
14
13
|
end
|
15
14
|
json = JSON.dump(array)
|
data/lib/fitting/version.rb
CHANGED
data/lib/tasks/fitting.rake
CHANGED
@@ -4,8 +4,137 @@ require 'fitting/records/realized_unit'
|
|
4
4
|
require 'fitting/templates/realized_template'
|
5
5
|
require 'fitting/statistics/template_cover_error'
|
6
6
|
require 'fitting/statistics/template_cover_error_enum'
|
7
|
+
require 'fitting/statistics/template_cover_error_one_of'
|
8
|
+
require 'fitting/cover/json_schema'
|
9
|
+
require 'fitting/report/prefixes'
|
10
|
+
require 'fitting/report/tests'
|
11
|
+
require 'fitting/report/console'
|
7
12
|
|
8
13
|
namespace :fitting do
|
14
|
+
task :report do
|
15
|
+
tests = Fitting::Report::Tests.new_from_config('fitting_tests/*.json')
|
16
|
+
prefixes = Fitting::Report::Prefixes.new('.fitting.yml')
|
17
|
+
|
18
|
+
prefixes.join(tests)
|
19
|
+
|
20
|
+
prefixes.to_a.map do |prefix|
|
21
|
+
prefix.actions.join(prefix.tests) unless prefix.skip?
|
22
|
+
end
|
23
|
+
|
24
|
+
prefixes.to_a.map do |prefix|
|
25
|
+
prefix.actions.to_a.map do |action|
|
26
|
+
action.responses.join(action.tests)
|
27
|
+
end unless prefix.skip?
|
28
|
+
end
|
29
|
+
|
30
|
+
prefixes.to_a.map do |prefix|
|
31
|
+
prefix.actions.to_a.map do |action|
|
32
|
+
action.responses.to_a.map do |response|
|
33
|
+
response.combinations.join(response.tests)
|
34
|
+
end
|
35
|
+
end unless prefix.skip?
|
36
|
+
end
|
37
|
+
|
38
|
+
report = JSON.pretty_generate(
|
39
|
+
{
|
40
|
+
tests_without_prefixes: tests.without_prefixes,
|
41
|
+
prefixes_details: prefixes.to_a.map { |p| p.details }
|
42
|
+
}
|
43
|
+
)
|
44
|
+
|
45
|
+
destination = 'fitting'
|
46
|
+
FileUtils.rm_r Dir.glob("#{destination}/*"), :force => true
|
47
|
+
File.open('fitting/report.json', 'w') { |file| file.write(report) }
|
48
|
+
|
49
|
+
gem_path = $LOAD_PATH.find { |i| i.include?('fitting') }
|
50
|
+
source_path = "#{gem_path}/templates/bomboniere/dist"
|
51
|
+
FileUtils.copy_entry source_path, destination
|
52
|
+
|
53
|
+
json_schemas = {}
|
54
|
+
combinations = {}
|
55
|
+
prefixes.to_a.map do |prefix|
|
56
|
+
prefix.actions.to_a.map do |action|
|
57
|
+
action.responses.to_a.map do |response|
|
58
|
+
json_schemas.merge!(response.id => response.body)
|
59
|
+
response.combinations.to_a.map do |combination|
|
60
|
+
combinations.merge!(combination.id => combination.json_schema)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end unless prefix.skip?
|
64
|
+
end
|
65
|
+
File.open('fitting/json_schemas.json', 'w') { |file| file.write(JSON.pretty_generate(json_schemas)) }
|
66
|
+
File.open('fitting/combinations.json', 'w') { |file| file.write(JSON.pretty_generate(combinations)) }
|
67
|
+
|
68
|
+
js_path = Dir["#{destination}/js/*"].find { |f| f[0..14] == 'fitting/js/app.' and f[-3..-1] == '.js' }
|
69
|
+
js_file = File.read(js_path)
|
70
|
+
new_js_file = js_file.gsub("{stub:\"prefixes report\"}", report)
|
71
|
+
new_js_file = new_js_file.gsub("{stub:\"for action page\"}", report)
|
72
|
+
new_js_file = new_js_file.gsub("{stub:\"json-schemas\"}", JSON.pretty_generate(json_schemas))
|
73
|
+
new_js_file = new_js_file.gsub("{stub:\"combinations\"}", JSON.pretty_generate(combinations))
|
74
|
+
File.open(js_path, 'w') { |file| file.write(new_js_file) }
|
75
|
+
|
76
|
+
console = Fitting::Report::Console.new(
|
77
|
+
tests.without_prefixes,
|
78
|
+
prefixes.to_a.map { |p| p.details }
|
79
|
+
)
|
80
|
+
|
81
|
+
puts console.output
|
82
|
+
|
83
|
+
exit 1 unless console.good?
|
84
|
+
|
85
|
+
exit 0
|
86
|
+
|
87
|
+
actions.map do |action|
|
88
|
+
action.to_hash["responses"].map do |response|
|
89
|
+
response['combination'] ||= []
|
90
|
+
combinations = Fitting::Cover::JSONSchema.new(response['body']).combi + Fitting::Cover::JSONSchemaEnum.new(response['body']).combi + Fitting::Cover::JSONSchemaOneOf.new(response['body']).combi
|
91
|
+
if combinations != []
|
92
|
+
combinations.map do |combination|
|
93
|
+
response['combination'].push(
|
94
|
+
{
|
95
|
+
'json_schema' => combination[0],
|
96
|
+
'type' => combination[1][0],
|
97
|
+
'combination' => combination[1][1],
|
98
|
+
'tests' => [],
|
99
|
+
'error' => []
|
100
|
+
}
|
101
|
+
)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
actions.map do |action|
|
108
|
+
action.to_hash["responses"].map do |response|
|
109
|
+
response['tests'] ||= []
|
110
|
+
response['tests'].map do |test|
|
111
|
+
if response['combination'][0]
|
112
|
+
response['combination'].map do |combination|
|
113
|
+
begin
|
114
|
+
res = JSON::Validator.fully_validate(combination['json_schema'], test['response']['body'])
|
115
|
+
if res == []
|
116
|
+
combination['tests'].push(test)
|
117
|
+
response['tests'] = response['tests'] - [test]
|
118
|
+
next
|
119
|
+
else
|
120
|
+
combination['error'].push({test: test, error: res})
|
121
|
+
end
|
122
|
+
rescue JSON::Schema::SchemaError => error
|
123
|
+
combination['error'].push({test: test, error: error})
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
actions_test = {actions: actions, tests: tests}
|
132
|
+
|
133
|
+
makedirs('fitting')
|
134
|
+
File.open('fitting/old_report.json', 'w') { |file| file.write(MultiJson.dump(actions_test)) }
|
135
|
+
end
|
136
|
+
|
137
|
+
# deprecated
|
9
138
|
desc 'Fitting documentation'
|
10
139
|
task :documentation do
|
11
140
|
documented_unit = Fitting::Statistics::Template.new(
|
@@ -53,12 +182,24 @@ namespace :fitting do
|
|
53
182
|
)
|
54
183
|
puts documented_unit.stats
|
55
184
|
|
185
|
+
unless documented_unit.not_covered == "\n"
|
186
|
+
puts 'Not all responses from the whitelist are covered!'
|
187
|
+
exit 1
|
188
|
+
end
|
189
|
+
elsif args.size == 'l'
|
190
|
+
documented_unit = Fitting::Statistics::Template.new(
|
191
|
+
Fitting::Records::Spherical::Requests.new,
|
192
|
+
Fitting.configuration,
|
193
|
+
'cover_one_of'
|
194
|
+
)
|
195
|
+
puts documented_unit.stats
|
196
|
+
|
56
197
|
unless documented_unit.not_covered == "\n"
|
57
198
|
puts 'Not all responses from the whitelist are covered!'
|
58
199
|
exit 1
|
59
200
|
end
|
60
201
|
else
|
61
|
-
puts 'need key xs, s or
|
202
|
+
puts 'need key xs, s, m or l'
|
62
203
|
end
|
63
204
|
end
|
64
205
|
|
@@ -76,11 +217,18 @@ namespace :fitting do
|
|
76
217
|
Fitting.configuration
|
77
218
|
)
|
78
219
|
puts documented_unit.stats
|
220
|
+
elsif args.size == 'l'
|
221
|
+
documented_unit = Fitting::Statistics::TemplateCoverErrorOneOf.new(
|
222
|
+
Fitting::Records::Spherical::Requests.new,
|
223
|
+
Fitting.configuration
|
224
|
+
)
|
225
|
+
puts documented_unit.stats
|
79
226
|
else
|
80
|
-
puts 'need key s or
|
227
|
+
puts 'need key s, m or l'
|
81
228
|
end
|
82
229
|
end
|
83
230
|
|
231
|
+
# deprecated
|
84
232
|
desc 'Fitting tests'
|
85
233
|
task :tests do
|
86
234
|
realized_unit = Fitting::Records::RealizedUnit.new(
|
@@ -0,0 +1,21 @@
|
|
1
|
+
.DS_Store
|
2
|
+
node_modules
|
3
|
+
|
4
|
+
# local env files
|
5
|
+
.env.local
|
6
|
+
.env.*.local
|
7
|
+
|
8
|
+
# Log files
|
9
|
+
npm-debug.log*
|
10
|
+
yarn-debug.log*
|
11
|
+
yarn-error.log*
|
12
|
+
pnpm-debug.log*
|
13
|
+
|
14
|
+
# Editor directories and files
|
15
|
+
.idea
|
16
|
+
.vscode
|
17
|
+
*.suo
|
18
|
+
*.ntvs*
|
19
|
+
*.njsproj
|
20
|
+
*.sln
|
21
|
+
*.sw?
|
@@ -0,0 +1 @@
|
|
1
|
+
nodejs 13.1.0
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# bomboniere
|
2
|
+
|
3
|
+
## Project setup
|
4
|
+
```
|
5
|
+
npm install
|
6
|
+
```
|
7
|
+
|
8
|
+
### Compiles and hot-reloads for development
|
9
|
+
```
|
10
|
+
npm run serve
|
11
|
+
```
|
12
|
+
|
13
|
+
### Compiles and minifies for production
|
14
|
+
```
|
15
|
+
npm run build
|
16
|
+
```
|
17
|
+
|
18
|
+
### Customize configuration
|
19
|
+
See [Configuration Reference](https://cli.vuejs.org/config/).
|