zillion 0.0.3 → 0.0.4
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/lib/zillion/mapper.rb +35 -8
- data/spec/mapper_spec.rb +51 -3
- data/zillion.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a03fdebc806dd28abd1d3813483727407848d7f1
|
4
|
+
data.tar.gz: 1e1a6a57c2e52d97f5f4b23978b98bb5ea404476
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d46e751cb62241643c8602ed271dff1d071d91d65cd83ce79c7cde2f292d852eb05e751c2a29ca3f1c340f4530f99f00c8e67c2fd28fcd27ba1a96f1534704f8
|
7
|
+
data.tar.gz: 530442ee7467e56ca985051a0a21f1c6cb76d26f8e65e40f0bd7ebf4e38c87aacb2a5d609d0a55707d0b640a4f132bc37176278b04d290b3b52b8a05a4bab1ee
|
data/lib/zillion/mapper.rb
CHANGED
@@ -39,12 +39,25 @@ class PlanFinder
|
|
39
39
|
self.class.available_plans_for(@counts)
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
def previous_plan_of(plan)
|
43
|
+
list = sorted_plans
|
44
|
+
num = list.index(mapper.get(plan))
|
45
|
+
return if num.to_i <= 0
|
46
|
+
list[num-1]
|
47
|
+
end
|
46
48
|
|
47
|
-
|
49
|
+
def next_plan_of(plan)
|
50
|
+
list = sorted_plans
|
51
|
+
num = list.index(mapper.get(plan)) or return
|
52
|
+
list[num+1]
|
53
|
+
end
|
54
|
+
|
55
|
+
def sorted_plans
|
56
|
+
sort_plans(mapper.all)
|
57
|
+
end
|
58
|
+
|
59
|
+
def sorted_available_plans
|
60
|
+
sort_plans(available_plans)
|
48
61
|
end
|
49
62
|
|
50
63
|
def best_plan
|
@@ -58,14 +71,27 @@ class PlanFinder
|
|
58
71
|
|
59
72
|
private
|
60
73
|
|
74
|
+
def sort_plans(list)
|
75
|
+
sorted_keys = list.keys.sort do |a, b|
|
76
|
+
fee_for(a) <=> fee_for(b)
|
77
|
+
end
|
78
|
+
|
79
|
+
sorted_keys.map { |key| mapper.get(key) }
|
80
|
+
end
|
81
|
+
|
61
82
|
def mapper
|
62
83
|
self.class.mapper
|
63
84
|
end
|
64
85
|
|
65
86
|
def compare(one, two, direction)
|
66
|
-
|
67
|
-
|
68
|
-
|
87
|
+
fee_for(one).send(direction, fee_for(two))
|
88
|
+
end
|
89
|
+
|
90
|
+
# returns fee for counts, if within limits, otherwise zero
|
91
|
+
def fee_for(plan_key)
|
92
|
+
mapper.get(plan_key).monthly_fee_for(@counts)
|
93
|
+
rescue Plan::OverLimitsError
|
94
|
+
0
|
69
95
|
end
|
70
96
|
|
71
97
|
end
|
@@ -101,6 +127,7 @@ class PlanMapper
|
|
101
127
|
|
102
128
|
def get(key)
|
103
129
|
raise "Please load first. No need to be an ass." if plans.empty?
|
130
|
+
return key if key.is_a?(Plan)
|
104
131
|
plans[key.to_sym]
|
105
132
|
end
|
106
133
|
|
data/spec/mapper_spec.rb
CHANGED
@@ -23,8 +23,9 @@ describe 'PlanFinder' do
|
|
23
23
|
|
24
24
|
let (:mapper) {
|
25
25
|
PlanMapper.new({
|
26
|
-
small:
|
27
|
-
|
26
|
+
small: { monthly_fee: 0, limits: { products: 100 } },
|
27
|
+
medium: { monthly_fee: 5, limits: { products: 150 } },
|
28
|
+
large: { monthly_fee: 10, limits: { products: 200 } }
|
28
29
|
})
|
29
30
|
}
|
30
31
|
|
@@ -32,6 +33,15 @@ describe 'PlanFinder' do
|
|
32
33
|
expect { PlanFinder.new({}) }.to raise_error # MissingCountError
|
33
34
|
end
|
34
35
|
|
36
|
+
describe '#sorted_plans' do
|
37
|
+
|
38
|
+
it 'returns all plans, including unavailable ones' do
|
39
|
+
finder = PlanFinder.init(mapper).new({ products: 120 })
|
40
|
+
expect(finder.sorted_plans.map(&:name)).to eql([:small, :medium, :large])
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
35
45
|
describe '#available_plans' do
|
36
46
|
|
37
47
|
it 'explodes if no limits passed' do
|
@@ -51,7 +61,7 @@ describe 'PlanFinder' do
|
|
51
61
|
|
52
62
|
it 'returns array with higher plan if over within both of them' do
|
53
63
|
finder = PlanFinder.init(mapper).new({ products: 150 })
|
54
|
-
expect(finder.available_plans).to eql({ large: mapper.get(:large) })
|
64
|
+
expect(finder.available_plans).to eql({ medium: mapper.get(:medium), large: mapper.get(:large) })
|
55
65
|
end
|
56
66
|
|
57
67
|
it 'returns array with both plans if under the lowest limit' do
|
@@ -61,6 +71,44 @@ describe 'PlanFinder' do
|
|
61
71
|
|
62
72
|
end
|
63
73
|
|
74
|
+
describe '#previous_plan_of(plan)' do
|
75
|
+
|
76
|
+
it 'returs nil if lowest plan' do
|
77
|
+
finder = PlanFinder.init(mapper).new({ products: 50 })
|
78
|
+
expect(finder.previous_plan_of(mapper.get(:small))).to be_nil
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'returs small if medium plan' do
|
82
|
+
finder = PlanFinder.init(mapper).new({ products: 50 })
|
83
|
+
expect(finder.previous_plan_of(:medium)).to be(mapper.get(:small))
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'returs medium if large plan' do
|
87
|
+
finder = PlanFinder.init(mapper).new({ products: 50 })
|
88
|
+
expect(finder.previous_plan_of(:large)).to be(mapper.get(:medium))
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#next_plan_of(plan)' do
|
94
|
+
|
95
|
+
it 'returs nil if highest plan' do
|
96
|
+
finder = PlanFinder.init(mapper).new({ products: 50 })
|
97
|
+
expect(finder.next_plan_of(mapper.get(:large))).to be_nil
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'returs large if medium plan' do
|
101
|
+
finder = PlanFinder.init(mapper).new({ products: 50 })
|
102
|
+
expect(finder.next_plan_of(:medium)).to be(mapper.get(:large))
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'returs medium if small plan' do
|
106
|
+
finder = PlanFinder.init(mapper).new({ products: 50 })
|
107
|
+
expect(finder.next_plan_of(:small)).to be(mapper.get(:medium))
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
64
112
|
describe '#best_plan' do
|
65
113
|
|
66
114
|
it 'returns nil if over all limits' do
|
data/zillion.gemspec
CHANGED