json_test_data 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +29 -0
- data/.rubocop.yml +1157 -0
- data/Gemfile.lock +1 -1
- data/features/numeric_constraints.feature +3 -3
- data/json_test_data.gemspec +1 -1
- data/lib/json_test_data/data_structures/helpers/number_helper.rb +2 -14
- data/lib/json_test_data/data_structures/number.rb +66 -8
- data/spec/json_test_data/data_structures/helpers/number_helper_spec.rb +0 -104
- data/spec/json_test_data/data_structures/number_spec.rb +22 -2
- data/version.rb +1 -1
- metadata +5 -3
data/Gemfile.lock
CHANGED
@@ -78,7 +78,7 @@ Feature: Numeric constraints
|
|
78
78
|
When I run the JSON data generator
|
79
79
|
Then the JSON output should be:
|
80
80
|
"""json
|
81
|
-
{"proportion":0.
|
81
|
+
{"proportion":0.83}
|
82
82
|
"""
|
83
83
|
|
84
84
|
Scenario: Multiple with minimum
|
@@ -89,7 +89,7 @@ Feature: Numeric constraints
|
|
89
89
|
"type": "object",
|
90
90
|
"properties": {
|
91
91
|
"wheels": {
|
92
|
-
"type": "
|
92
|
+
"type": "integer",
|
93
93
|
"multipleOf": 4,
|
94
94
|
"minimum": 5
|
95
95
|
}
|
@@ -99,5 +99,5 @@ Feature: Numeric constraints
|
|
99
99
|
When I run the JSON data generator
|
100
100
|
Then the JSON output should be:
|
101
101
|
"""json
|
102
|
-
{"wheels":
|
102
|
+
{"wheels":20}
|
103
103
|
"""
|
data/json_test_data.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.version = JsonTestData::VERSION
|
7
7
|
s.authors = ["Dana Scheider"]
|
8
8
|
s.description = "Generate test data from JSON schema"
|
9
|
-
s.summary = "
|
9
|
+
s.summary = "json_test_data-#{s.version}"
|
10
10
|
s.email = 'dana.scheider@gmail.com'
|
11
11
|
s.license = 'MIT'
|
12
12
|
s.platform = Gem::Platform::RUBY
|
@@ -1,23 +1,11 @@
|
|
1
1
|
module JsonTestData
|
2
2
|
module NumberHelper
|
3
|
-
def adjust_for_maximum(number:, maximum: nil, step_size: nil)
|
4
|
-
return number unless (maximum && number >= maximum)
|
5
|
-
|
6
|
-
num = !!step_size ? number - step_size : maximum - 1
|
7
|
-
adjust_for_maximum(number: num, maximum: maximum, step_size: step_size)
|
8
|
-
end
|
9
|
-
|
10
|
-
def adjust_for_minimum(number:, minimum: nil, step_size: nil)
|
11
|
-
return number unless minimum && minimum >= number
|
12
|
-
|
13
|
-
num = !!step_size ? number + step_size : minimum + 1
|
14
|
-
adjust_for_minimum(number: num, minimum: minimum, step_size: step_size)
|
15
|
-
end
|
16
|
-
|
17
3
|
def between(min:, max:, integer: false)
|
18
4
|
return integer ? mean(min, max).round(0) : mean(min, max)
|
19
5
|
end
|
20
6
|
|
7
|
+
private
|
8
|
+
|
21
9
|
def mean(*numbers)
|
22
10
|
numbers.inject(:+).to_f.quo(numbers.length)
|
23
11
|
end
|
@@ -9,17 +9,75 @@ module JsonTestData
|
|
9
9
|
factor = schema.fetch(:multipleOf, nil)
|
10
10
|
minimum, maximum = schema.fetch(:minimum, nil), schema.fetch(:maximum, nil)
|
11
11
|
|
12
|
-
num =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
num = new(min: minimum, max: maximum, factor: factor, type: schema.fetch(:type, "number").to_sym)
|
13
|
+
num.adjust!
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def ensure_multiple_of(number, factor=1)
|
19
|
+
number % factor == 0 ? number : number * factor
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_accessor :value, :maximum, :minimum, :type, :factor
|
24
|
+
|
25
|
+
def initialize(min: nil, max: nil, factor: nil, value: nil, type: nil)
|
26
|
+
@factor, @minimum, @maximum = factor, min, max
|
27
|
+
@value = value || @factor || 1
|
28
|
+
@type = type || :number
|
29
|
+
end
|
30
|
+
|
31
|
+
def step_size
|
32
|
+
return @step_size ||= is_int? ? 1 : 0.5 unless minimum && maximum
|
33
|
+
|
34
|
+
@step_size ||= Number.between(min: minimum, max: maximum, integer: type == :integer) / 3
|
35
|
+
is_int? ? @step_size.to_i : @step_size.round(2)
|
36
|
+
end
|
37
|
+
|
38
|
+
def ensure_multiple_of!
|
39
|
+
@value *= factor unless value % factor == 0
|
40
|
+
end
|
17
41
|
|
18
|
-
|
42
|
+
def adjust_for_divisibility!
|
43
|
+
return if value_divisible_by_factor?
|
44
|
+
@value *= factor
|
45
|
+
end
|
46
|
+
|
47
|
+
def is_int?
|
48
|
+
type == :integer
|
49
|
+
end
|
50
|
+
|
51
|
+
def value_too_low?
|
52
|
+
return false unless minimum
|
53
|
+
@value <= minimum
|
54
|
+
end
|
55
|
+
|
56
|
+
def value_too_high?
|
57
|
+
return false unless maximum
|
58
|
+
@value >= maximum
|
59
|
+
end
|
19
60
|
|
20
|
-
|
21
|
-
|
61
|
+
def value_divisible_by_factor?
|
62
|
+
return true unless factor
|
63
|
+
@value % factor == 0
|
64
|
+
end
|
65
|
+
|
66
|
+
def should_be_int_but_isnt?
|
67
|
+
type == :integer && !@value.is_a?(Integer)
|
68
|
+
end
|
69
|
+
|
70
|
+
def adjust!
|
71
|
+
while !value_divisible_by_factor? || value_too_low? || value_too_high? || should_be_int_but_isnt?
|
72
|
+
adjust_for_divisibility!
|
73
|
+
|
74
|
+
@value -= step_size if value_too_high?
|
75
|
+
@value += step_size if value_too_low?
|
22
76
|
end
|
77
|
+
|
78
|
+
@value ||= 1
|
79
|
+
puts "TYPE: #{type}"
|
80
|
+
@type == :number ? @value : @value.to_i
|
23
81
|
end
|
24
82
|
end
|
25
83
|
end
|
@@ -1,110 +1,6 @@
|
|
1
1
|
describe JsonTestData::NumberHelper do
|
2
2
|
include JsonTestData::NumberHelper
|
3
3
|
|
4
|
-
describe "#adjust_for_maximum" do
|
5
|
-
context "no maximum" do
|
6
|
-
let(:number) { 3 }
|
7
|
-
|
8
|
-
it "returns the given number" do
|
9
|
-
expect(adjust_for_maximum(number: number)).to eql number
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
context "number less than maximum" do
|
14
|
-
let(:number) { 3 }
|
15
|
-
let(:maximum) { 4 }
|
16
|
-
|
17
|
-
it "returns the given number" do
|
18
|
-
expect(adjust_for_maximum(number: number, maximum: maximum)).to eql number
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context "number greater than or equal to maximum" do
|
23
|
-
let(:number) { 3 }
|
24
|
-
let(:maximum) { 3 }
|
25
|
-
|
26
|
-
it "returns one less than the maximum" do
|
27
|
-
expect(adjust_for_maximum(number: number, maximum: maximum)).to eql maximum - 1
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "step size greater than 1" do
|
32
|
-
let(:number) { 3 }
|
33
|
-
let(:maximum) { 3 }
|
34
|
-
let(:step_size) { 2 }
|
35
|
-
|
36
|
-
it "returns the number reduced by step size" do
|
37
|
-
expect(
|
38
|
-
adjust_for_maximum(number: number, maximum: maximum, step_size: step_size)
|
39
|
-
).to eql maximum - step_size
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context "step size less than 1" do
|
44
|
-
let(:number) { 3 }
|
45
|
-
let(:maximum) { 3 }
|
46
|
-
let(:step_size) { 0.25 }
|
47
|
-
|
48
|
-
it "returns the number reduced by step size" do
|
49
|
-
expect(
|
50
|
-
adjust_for_maximum(number: number, maximum: maximum, step_size: step_size)
|
51
|
-
).to eql maximum - step_size
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe "#adjust_for_minimum" do
|
57
|
-
context "no minimum" do
|
58
|
-
let(:number) { 1 }
|
59
|
-
|
60
|
-
it "returns the given number" do
|
61
|
-
expect(adjust_for_minimum(number: number)).to eql number
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context "number is greater than minimum" do
|
66
|
-
let(:number) { 1 }
|
67
|
-
let(:minimum) { 0 }
|
68
|
-
|
69
|
-
it "returns the number" do
|
70
|
-
expect(adjust_for_minimum(number: number, minimum: minimum)).to eql number
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context "number is less than or equal to minimum" do
|
75
|
-
let(:number) { 2 }
|
76
|
-
let(:minimum) { 2 }
|
77
|
-
|
78
|
-
it "returns one more than the minimum" do
|
79
|
-
expect(adjust_for_minimum(number: number, minimum: minimum)).to eql minimum + 1
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context "step size greater than 1" do
|
84
|
-
let(:number) { 2 }
|
85
|
-
let(:minimum) { 2 }
|
86
|
-
let(:step_size) { 2 }
|
87
|
-
|
88
|
-
it "returns the number increased by step size" do
|
89
|
-
expect(
|
90
|
-
adjust_for_minimum(number: number, minimum: minimum, step_size: step_size)
|
91
|
-
).to eql minimum + step_size
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context "step size less than 1" do
|
96
|
-
let(:number) { 2 }
|
97
|
-
let(:minimum) { 2 }
|
98
|
-
let(:step_size) { 0.5 }
|
99
|
-
|
100
|
-
it "returns the number reduced by step size" do
|
101
|
-
expect(
|
102
|
-
adjust_for_minimum(number: number, minimum: minimum, step_size: step_size)
|
103
|
-
).to eql minimum + step_size
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
4
|
describe "#between" do
|
109
5
|
context "when it doesn't have to be an integer" do
|
110
6
|
let(:min) { 1 }
|
@@ -17,12 +17,12 @@ describe JsonTestData::Number do
|
|
17
17
|
let(:object) do
|
18
18
|
{
|
19
19
|
type: "number",
|
20
|
-
multipleOf:
|
20
|
+
multipleOf: 2
|
21
21
|
}
|
22
22
|
end
|
23
23
|
|
24
24
|
it "returns a multiple of the given number" do
|
25
|
-
expect(described_class.create(object)).to be_a_multiple_of(
|
25
|
+
expect(described_class.create(object)).to be_a_multiple_of(2)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -93,6 +93,26 @@ describe JsonTestData::Number do
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
end
|
96
|
+
|
97
|
+
context "minimum not a multiple of multiple" do
|
98
|
+
let(:minimum) { 3 }
|
99
|
+
let(:factor) { 5 }
|
100
|
+
let(:object) do
|
101
|
+
{
|
102
|
+
type: "number",
|
103
|
+
minimum: minimum,
|
104
|
+
multipleOf: factor
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
it "returns a multiple of the given factor" do
|
109
|
+
expect(described_class.create(object)).to be_a_multiple_of(factor)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "returns a number higher than the minimum" do
|
113
|
+
expect(described_class.create(object)).to be_greater_than_or_equal_to(minimum)
|
114
|
+
end
|
115
|
+
end
|
96
116
|
end
|
97
117
|
end
|
98
118
|
end
|
data/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json_test_data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dana Scheider
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: regxing
|
@@ -128,7 +128,9 @@ executables: []
|
|
128
128
|
extensions: []
|
129
129
|
extra_rdoc_files: []
|
130
130
|
files:
|
131
|
+
- ".codeclimate.yml"
|
131
132
|
- ".rspec"
|
133
|
+
- ".rubocop.yml"
|
132
134
|
- ".travis.yml"
|
133
135
|
- Gemfile
|
134
136
|
- Gemfile.lock
|
@@ -182,7 +184,7 @@ rubyforge_project:
|
|
182
184
|
rubygems_version: 2.5.1
|
183
185
|
signing_key:
|
184
186
|
specification_version: 4
|
185
|
-
summary:
|
187
|
+
summary: json_test_data-0.6.0
|
186
188
|
test_files:
|
187
189
|
- features/array_constraints.feature
|
188
190
|
- features/data_types.feature
|