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.
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