json_test_data 0.5.1 → 0.6.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 +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
|