ski_binding_calculator 0.6.1 → 0.6.5
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/lib/ski_binding_calculator/calculator.rb +2 -3
- data/ski_binding_calculator.gemspec +2 -1
- data/spec/lib/calculator_spec.rb +119 -93
- data/spec/lib/code_spec.rb +3 -12
- data/spec/lib/config_loader_spec.rb +17 -53
- data/spec/lib/setting_spec.rb +5 -20
- metadata +18 -2
@@ -22,8 +22,7 @@ class SkiBinding::Calculator
|
|
22
22
|
hashy[:shoe_size] = attrs[:shoe_size].to_f || attrs["shoe_size"].to_f
|
23
23
|
hashy[:birthday] = attrs[:birthday] || attrs["birthdate"]
|
24
24
|
hashy[:type] = attrs[:type] || attrs["type"]
|
25
|
-
|
26
|
-
attrs
|
25
|
+
hashy
|
27
26
|
end
|
28
27
|
|
29
28
|
def self.age(attrs)
|
@@ -82,7 +81,7 @@ class SkiBinding::Calculator
|
|
82
81
|
settings.each do |s|
|
83
82
|
if s.shoe_size_range.include?(attrs[:shoe_size])
|
84
83
|
unless s.z_value.nil?
|
85
|
-
return {
|
84
|
+
return {:z_value => s.z_value}
|
86
85
|
else
|
87
86
|
raise ArgumentError, "Please calculate z-index by hand."
|
88
87
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'ski_binding_calculator'
|
4
|
-
s.version = '0.6.
|
4
|
+
s.version = '0.6.5'
|
5
5
|
s.summary = "Ski Binding Calculator"
|
6
6
|
s.description = "Calculates the z-value according to ISO 11088."
|
7
7
|
s.authors = ["Jonas Ruef, Felix Langenegger"]
|
@@ -13,6 +13,7 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.add_development_dependency "spork", "~> 0.9.2"
|
14
14
|
s.add_development_dependency "simplecov", "~> 0.7.1"
|
15
15
|
s.add_development_dependency "timecop", "~> 0.6.3"
|
16
|
+
s.add_development_dependency "fuubar", "~> 1.1.1"
|
16
17
|
|
17
18
|
s.files = Dir.glob("{config,lib,spec}/**/*")
|
18
19
|
s.files += %w(Rakefile ski_binding_calculator.gemspec)
|
data/spec/lib/calculator_spec.rb
CHANGED
@@ -1,144 +1,170 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'timecop'
|
3
3
|
|
4
|
+
# The scenario: according to table B.1 in ISO 11088 a skier which is
|
5
|
+
# type 2, 70 kg of weight, 170cm of height, has a sole length of
|
6
|
+
# 315mm, and is born 01/01/1983 has code "L" or in our notation 11
|
7
|
+
# (see readme for details on codes). Furthermore it's z_value is 6.
|
4
8
|
describe SkiBinding::Calculator do
|
9
|
+
subject(:skiers_parameters) do
|
10
|
+
{ :type => "Type2",
|
11
|
+
:weight => "70",
|
12
|
+
:height => "170",
|
13
|
+
:shoe_size => "315",
|
14
|
+
:birthday => "1983-01-01" }
|
15
|
+
end
|
16
|
+
subject(:expected_preped) do
|
17
|
+
{ :type => "Type2",
|
18
|
+
:weight => 70.0,
|
19
|
+
:height => 170.0,
|
20
|
+
:shoe_size => 315.0,
|
21
|
+
:birthday => "1983-01-01" }
|
22
|
+
end
|
23
|
+
subject(:expected_aged) do
|
24
|
+
{ :type => "Type2",
|
25
|
+
:weight => 70.0,
|
26
|
+
:height => 170.0,
|
27
|
+
:shoe_size => 315.0,
|
28
|
+
:age => 30 }
|
29
|
+
end
|
30
|
+
subject(:expected_validated) do
|
31
|
+
{ :type => 1,
|
32
|
+
:weight => 70.0,
|
33
|
+
:height => 170.0,
|
34
|
+
:shoe_size => 315.0,
|
35
|
+
:age => 30 }
|
36
|
+
end
|
37
|
+
subject(:expected_code) { 11 }
|
38
|
+
subject(:expected_setting) do
|
39
|
+
{ :z_value => 6 }
|
40
|
+
end
|
41
|
+
|
5
42
|
before(:all) do
|
6
|
-
|
7
|
-
:weight => "70",
|
8
|
-
:height => "170",
|
9
|
-
:shoe_size => "315",
|
10
|
-
:birthday => "1983-01-01"}
|
11
|
-
#We freeze time so birthday will always be 30 years back
|
43
|
+
#freeze time! so birthday will always be 30 years back
|
12
44
|
Timecop.freeze(2013, 8, 13)
|
13
45
|
end
|
14
46
|
|
15
47
|
describe "#new" do
|
16
|
-
it
|
17
|
-
SkiBinding::Calculator.new.class.should == SkiBinding::Calculator
|
18
|
-
end
|
48
|
+
it { SkiBinding::Calculator.new.class.should == SkiBinding::Calculator }
|
19
49
|
end
|
20
50
|
|
21
51
|
describe "#prep_attributes" do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
:shoe_size => 315.0,
|
27
|
-
:birthday => "1983-01-01"}
|
28
|
-
SkiBinding::Calculator.prep_attributes(@hash).should == expected_hash
|
29
|
-
end
|
52
|
+
subject(:calculated_preped) { SkiBinding::Calculator.prep_attributes(parameters) }
|
53
|
+
let(:parameters) { skiers_parameters }
|
54
|
+
|
55
|
+
it { calculated_preped.should == expected_preped }
|
30
56
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
57
|
+
context "when weight < 10kg" do
|
58
|
+
let(:parameters) do
|
59
|
+
skiers_parameters[:weight] = 9
|
60
|
+
skiers_parameters
|
61
|
+
end
|
62
|
+
it { expect { calculated_preped }
|
63
|
+
.to raise_error(ArgumentError, "Weight must be at least 10kg") }
|
36
64
|
end
|
37
65
|
end
|
38
66
|
|
39
67
|
describe "#age" do
|
40
|
-
|
41
|
-
|
42
|
-
end
|
68
|
+
subject(:calculated_aged) { SkiBinding::Calculator.age(preped) }
|
69
|
+
let(:preped) { expected_preped }
|
43
70
|
|
44
|
-
it
|
45
|
-
result = SkiBinding::Calculator.age(@preped_hash)
|
46
|
-
result[:age].should == 30
|
47
|
-
end
|
71
|
+
it { calculated_aged.should == expected_aged }
|
48
72
|
end
|
49
73
|
|
50
74
|
describe "#validate_type" do
|
51
|
-
|
52
|
-
|
53
|
-
@aged_hash = SkiBinding::Calculator.age(preped_hash)
|
54
|
-
end
|
75
|
+
subject(:calculated_validated) { SkiBinding::Calculator.validate_type(aged) }
|
76
|
+
let(:aged) { expected_aged }
|
55
77
|
|
56
78
|
it "sets \"Type2\" to 1" do
|
57
|
-
|
58
|
-
result[:type].should == 1
|
79
|
+
calculated_validated.should == expected_validated
|
59
80
|
end
|
60
81
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
expect {
|
68
|
-
|
82
|
+
context "when type is \"unknown\"" do
|
83
|
+
let(:aged) do
|
84
|
+
expected_aged[:type] = "unknown"
|
85
|
+
expected_aged
|
86
|
+
end
|
87
|
+
|
88
|
+
it{ expect { calculated_validated }
|
89
|
+
.to raise_error(ArgumentError, "You have entered an invalid type.") }
|
69
90
|
end
|
70
91
|
end
|
71
92
|
|
72
|
-
|
73
93
|
describe "#binding_code" do
|
74
|
-
|
75
|
-
|
76
|
-
aged_hash = SkiBinding::Calculator.age(preped_hash)
|
77
|
-
@type_validated_hash = SkiBinding::Calculator.validate_type(aged_hash)
|
78
|
-
end
|
94
|
+
subject(:calculated_code) { SkiBinding::Calculator.binding_code(validated) }
|
95
|
+
let(:validated) { expected_validated }
|
79
96
|
|
80
|
-
it
|
81
|
-
SkiBinding::Calculator.binding_code(@type_validated_hash).should == 11
|
82
|
-
end
|
97
|
+
it{ calculated_code.should == 11 }
|
83
98
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
99
|
+
context "when weight < 13kg" do
|
100
|
+
let(:validated) do
|
101
|
+
expected_validated[:weight] = 12
|
102
|
+
expected_validated
|
103
|
+
end
|
104
|
+
#because "Type 2" is given the code would be changed to 1
|
105
|
+
it{ calculated_code.should == 0 }
|
88
106
|
end
|
89
107
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
108
|
+
context "when no code found" do
|
109
|
+
let(:validated) do
|
110
|
+
expected_validated[:weight] = -1
|
111
|
+
expected_validated[:height] = -1
|
112
|
+
expected_validated
|
113
|
+
end
|
114
|
+
|
115
|
+
it { expect { calculated_code }.
|
116
|
+
to raise_error(ArgumentError, "You have entered invalid weight and/or height") }
|
95
117
|
end
|
96
118
|
|
97
|
-
context "
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
119
|
+
context "when age >= 50 || age < 10" do
|
120
|
+
context "age is 50" do
|
121
|
+
let(:validated) do
|
122
|
+
expected_validated[:age] = 50
|
123
|
+
expected_validated
|
124
|
+
end
|
125
|
+
|
126
|
+
it { calculated_code.should == (expected_code - 1) }
|
103
127
|
end
|
104
128
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
129
|
+
context "age is 51" do
|
130
|
+
let(:validated) do
|
131
|
+
expected_validated[:age] = 51
|
132
|
+
expected_validated
|
133
|
+
end
|
134
|
+
|
135
|
+
it { calculated_code.should == (expected_code - 1) }
|
109
136
|
end
|
110
137
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
138
|
+
context "age is 9" do
|
139
|
+
let(:validated) do
|
140
|
+
expected_validated[:age] = 9
|
141
|
+
expected_validated
|
142
|
+
end
|
143
|
+
|
144
|
+
it { calculated_code.should == (expected_code - 1) }
|
115
145
|
end
|
116
146
|
end
|
117
147
|
end
|
118
|
-
|
148
|
+
|
119
149
|
describe "#binding_setting" do
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
@type_validated_hash = SkiBinding::Calculator.validate_type(aged_hash)
|
124
|
-
end
|
150
|
+
subject(:calculated_setting) { SkiBinding::Calculator.binding_setting(validated, binding_code) }
|
151
|
+
let(:binding_code) { expected_code }
|
152
|
+
let(:validated) { expected_validated }
|
125
153
|
|
126
|
-
it
|
127
|
-
SkiBinding::Calculator.binding_setting(@type_validated_hash, 11).should ==
|
128
|
-
{"z_value"=>6}
|
129
|
-
end
|
154
|
+
it{ calculated_setting.should == expected_setting }
|
130
155
|
|
131
|
-
|
132
|
-
|
133
|
-
|
156
|
+
context "when no setting found" do
|
157
|
+
let(:binding_code) { 0 }
|
158
|
+
it{ expect { calculated_setting }
|
159
|
+
.to raise_error(ArgumentError, "Please calculate z-index by hand.") }
|
134
160
|
end
|
135
161
|
end
|
136
|
-
|
162
|
+
|
137
163
|
describe "#setting" do
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
164
|
+
subject(:all_at_once_calculated) { SkiBinding::Calculator.setting(parameters) }
|
165
|
+
let(:parameters) { skiers_parameters }
|
166
|
+
|
167
|
+
it{ all_at_once_calculated.should == expected_setting }
|
142
168
|
end
|
143
169
|
|
144
170
|
after(:all) do
|
data/spec/lib/code_spec.rb
CHANGED
@@ -7,18 +7,9 @@ describe SkiBinding::Code do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
context "instantiated Code class" do
|
11
|
-
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
it "has attribute weight" do
|
16
|
-
@code.should respond_to :weight
|
17
|
-
end
|
18
|
-
|
19
|
-
it "has attribute heigth" do
|
20
|
-
@code.should respond_to :height
|
21
|
-
end
|
10
|
+
context "when instantiated Code class" do
|
11
|
+
it { should respond_to :weight }
|
12
|
+
it { should respond_to :height }
|
22
13
|
end
|
23
14
|
end
|
24
15
|
|
@@ -1,69 +1,33 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
# For original table with codes referred to in this tests see iso 11088
|
4
|
+
# Table B.1
|
3
5
|
describe "ConfigLoader" do
|
4
|
-
|
5
|
-
before(:all) do
|
6
|
-
@range = 0..15 #cause 16 settings
|
7
|
-
@dummy_class = DummyClass.new
|
8
|
-
@dummy_class.extend(SkiBinding::ConfigLoader)
|
9
|
-
end
|
6
|
+
subject(:dummy_class) { DummyClass.new.extend(SkiBinding::ConfigLoader) }
|
10
7
|
|
11
8
|
describe "loading binding codes:" do
|
12
|
-
it
|
13
|
-
@dummy_class.load_binding_codes.class.should_not == nil
|
14
|
-
end
|
9
|
+
it { dummy_class.load_binding_codes.class.should_not == nil }
|
15
10
|
|
16
|
-
context "loaded codes" do
|
17
|
-
|
18
|
-
@codes = @dummy_class.load_binding_codes
|
19
|
-
end
|
20
|
-
|
21
|
-
it "is array" do
|
22
|
-
@codes.class.should == Array
|
23
|
-
end
|
11
|
+
context "when loaded codes" do
|
12
|
+
subject(:codes) { dummy_class.load_binding_codes }
|
24
13
|
|
25
|
-
it
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
it "has 15 codes" do
|
30
|
-
@codes.size.should == 13
|
31
|
-
end
|
14
|
+
it{ codes.class.should == Array }
|
15
|
+
it{ codes[0].class.should == SkiBinding::Code }
|
16
|
+
it{ codes.size.should == 13 }
|
32
17
|
end
|
33
18
|
end
|
34
19
|
|
35
20
|
describe "loading binding settings for all codes" do
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
21
|
+
subject(:settings_all_codes) do
|
22
|
+
settings = []
|
23
|
+
(0..15).each { |i| settings << dummy_class.load_binding_settings(i) }
|
24
|
+
settings
|
40
25
|
end
|
41
26
|
|
42
|
-
context "
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
@settings_all_codes << @dummy_class.load_binding_settings(index)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
it "is array" do
|
51
|
-
@settings_all_codes.each do |s|
|
52
|
-
s.class.should == Array
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
it "first element is setting" do
|
57
|
-
@settings_all_codes.each do |s|
|
58
|
-
s[0].class.should == SkiBinding::Setting
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it "has 6 settings" do
|
63
|
-
@settings_all_codes.each do |s|
|
64
|
-
s.size.should == 8
|
65
|
-
end
|
66
|
-
end
|
27
|
+
context "for each code" do
|
28
|
+
it { settings_all_codes.each { |s| s.class.should == Array } }
|
29
|
+
it { settings_all_codes.each { |s| s[0].class.should == SkiBinding::Setting } }
|
30
|
+
it { settings_all_codes.each { |s| s.size.should == 8 } }
|
67
31
|
end
|
68
32
|
end
|
69
33
|
end
|
data/spec/lib/setting_spec.rb
CHANGED
@@ -7,25 +7,10 @@ describe SkiBinding::Setting do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
context "instantiated Setting class" do
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
it "has attribute shoe_size_range" do
|
16
|
-
@setting.should respond_to :shoe_size_range
|
17
|
-
end
|
18
|
-
|
19
|
-
it "has attribute z_value" do
|
20
|
-
@setting.should respond_to :z_value
|
21
|
-
end
|
22
|
-
|
23
|
-
it "has attribute twist" do
|
24
|
-
@setting.should respond_to :twist
|
25
|
-
end
|
26
|
-
|
27
|
-
it "has attribute forward_lean" do
|
28
|
-
@setting.should respond_to :forward_lean
|
29
|
-
end
|
10
|
+
context "when instantiated Setting class" do
|
11
|
+
it { should respond_to :shoe_size_range }
|
12
|
+
it { should respond_to :z_value }
|
13
|
+
it { should respond_to :twist }
|
14
|
+
it { should respond_to :forward_lean }
|
30
15
|
end
|
31
16
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ski_binding_calculator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: 0.6.3
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: fuubar
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.1.1
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.1.1
|
78
94
|
description: Calculates the z-value according to ISO 11088.
|
79
95
|
email: support@fadendaten.ch
|
80
96
|
executables: []
|