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.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- json_test_data (0.5.1)
4
+ json_test_data (0.6.0)
5
5
  regxing (~> 0.1.0.beta)
6
6
 
7
7
  GEM
@@ -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.5}
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": "number",
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":8}
102
+ {"wheels":20}
103
103
  """
@@ -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 = "rambo-#{s.version}"
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 = if maximum && minimum
13
- between(min: minimum, max: maximum, integer: schema.fetch(:type) == "")
14
- else
15
- factor || 1
16
- end
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
- step_size = schema.fetch(:type) == "integer" ? 1 : 0.5
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
- num = adjust_for_maximum(number: num, maximum: maximum, step_size: factor || step_size)
21
- adjust_for_minimum(number: num, minimum: minimum, step_size: factor || step_size)
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: factor
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(factor)
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
@@ -1,3 +1,3 @@
1
1
  module JsonTestData
2
- VERSION = '0.5.1'
2
+ VERSION = '0.6.0'
3
3
  end
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.5.1
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-24 00:00:00.000000000 Z
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: rambo-0.5.1
187
+ summary: json_test_data-0.6.0
186
188
  test_files:
187
189
  - features/array_constraints.feature
188
190
  - features/data_types.feature