haversack 0.3.0 → 1.0.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/README.md +3 -1
- data/haversack.gemspec +1 -1
- data/lib/haversack.rb +1 -0
- data/lib/haversack/itemcollection.rb +33 -0
- data/lib/haversack/sack.rb +40 -58
- data/lib/haversack/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee68cfa21230115da4dccd2b313615367ae482ffbc428f8b439dbb88ec87712d
|
4
|
+
data.tar.gz: 25ef9a07cb8b920114eecb288b89eb9db0cc2072c35ecac6027fd98636b932bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2b76426d798393318ba9c69319713284dd10f367d37166949a6d10a2ea9bf3be6980e388eef66cf8c747e39f937c8d65b1126cf3409343f54dd3dd29541216a
|
7
|
+
data.tar.gz: 6d0399fecfa4b92a0e85065023762d332aefcce21e60c1ed3c1f33c5c2da3e16203261f0101a875c67866f889a6a7212790e4cbf7bfb9186a14ee91f62df74a2
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# Haversack
|
2
|
+
[](https://travis-ci.org/alex0112/haversack) [](https://codeclimate.com/github/alex0112/haversack/maintainability)
|
3
|
+
|
2
4
|
|
3
5
|
Haversack is an enumerable abstraction of a [Knapsack](https://en.wikipedia.org/wiki/Knapsack_problem).
|
4
6
|
|
@@ -52,7 +54,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
52
54
|
|
53
55
|
## Contributing
|
54
56
|
|
55
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
57
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/alex0112/haversack.
|
56
58
|
|
57
59
|
## License
|
58
60
|
|
data/haversack.gemspec
CHANGED
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
|
|
34
34
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
35
35
|
spec.require_paths = ["lib/haversack.rb"]
|
36
36
|
|
37
|
-
spec.add_development_dependency "bundler", "~> 1
|
37
|
+
spec.add_development_dependency "bundler", "~> 2.0.1"
|
38
38
|
spec.add_development_dependency "rake", "~> 10.0"
|
39
39
|
spec.add_development_dependency "rspec", "~> 3.0"
|
40
40
|
spec.add_development_dependency "factory_bot", "~> 4.0"
|
data/lib/haversack.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Haversack
|
2
|
+
class ItemCollection < Array
|
3
|
+
|
4
|
+
def initialize(data, &block)
|
5
|
+
if !block_given?
|
6
|
+
raise ArgumentError, "expected #{data} to contain only elements of class Haversack::Item" unless data.is_a?(Array) && ItemCollection.only_items?(data)
|
7
|
+
end
|
8
|
+
|
9
|
+
@size = self.size
|
10
|
+
@weight = self.weight
|
11
|
+
|
12
|
+
block_given? ? super(data, block) : super(data)
|
13
|
+
end
|
14
|
+
|
15
|
+
def size
|
16
|
+
map(&:size).sum
|
17
|
+
end
|
18
|
+
|
19
|
+
def weight
|
20
|
+
map(&:weight).sum
|
21
|
+
end
|
22
|
+
|
23
|
+
def push(obj)
|
24
|
+
raise Haversack::KnapsackContentError unless obj.is_a? Haversack::Item
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.only_items?(data)
|
29
|
+
data.all? { |el| el.is_a? Haversack::Item }
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
data/lib/haversack/sack.rb
CHANGED
@@ -1,79 +1,61 @@
|
|
1
|
-
|
2
|
-
include Enumerable
|
1
|
+
require 'haversack/itemcollection'
|
3
2
|
|
4
|
-
|
3
|
+
class Sack < Haversack::ItemCollection
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
@weight = weight
|
9
|
-
self.contents = contents || [] ## Use the setter to enforce weight/capacity restrictions
|
10
|
-
@current_weight = self.current_weight
|
11
|
-
@available_capacity = self.available_capacity
|
12
|
-
end
|
13
|
-
|
14
|
-
def method_missing(method_id)
|
15
|
-
Enumerable.respond_to? method_id ? @contents.send(method_id) : raise(NoMethodError)
|
16
|
-
end
|
5
|
+
attr_accessor :capacity
|
6
|
+
attr_accessor :max_weight
|
17
7
|
|
18
|
-
def
|
19
|
-
raise Haversack::KnapsackContentError if has_non_items? new_contents
|
20
|
-
raise Haversack::KnapsackCapacityExceededError if exceeds_capacity? new_contents
|
21
|
-
raise Haversack::KnapsackWeightExceededError if exceeds_weight? new_contents
|
8
|
+
def initialize(data, capacity:, max_weight:, &block)
|
22
9
|
|
23
|
-
@
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
@contents.empty? ? 0 : @contents.map { |item| item.weight }.sum
|
32
|
-
end
|
10
|
+
@capacity = capacity
|
11
|
+
@max_weight = max_weight
|
12
|
+
|
13
|
+
block_given? ? super(data, &block) : super(data)
|
14
|
+
|
15
|
+
raise Haversack::KnapsackCapacityExceededError if contents_exceed_capacity?
|
16
|
+
raise Haversack::KnapsackWeightExceededError if contents_exceed_weight?
|
17
|
+
end
|
33
18
|
|
34
|
-
|
35
|
-
|
36
|
-
def fits_item_weight?(item)
|
37
|
-
item.weight + @current_weight <= @weight
|
19
|
+
def available_weight
|
20
|
+
empty? ? @max_weight : (@max_weight - weight)
|
38
21
|
end
|
39
22
|
|
40
23
|
def available_capacity
|
41
|
-
|
24
|
+
empty? ? @capacity : (@capacity - size)
|
42
25
|
end
|
43
26
|
|
44
|
-
def
|
45
|
-
item.
|
27
|
+
def fits_weight?(item)
|
28
|
+
item.weight <= available_weight
|
46
29
|
end
|
47
30
|
|
48
|
-
def
|
49
|
-
|
31
|
+
def exceeds_weight?(item)
|
32
|
+
!fits_weight?(item)
|
50
33
|
end
|
51
|
-
|
52
|
-
def
|
53
|
-
|
54
|
-
@contents
|
34
|
+
|
35
|
+
def fits_capacity?(item)
|
36
|
+
item.size <= available_capacity
|
55
37
|
end
|
56
38
|
|
57
|
-
def
|
58
|
-
|
39
|
+
def exceeds_capacity?(item)
|
40
|
+
!fits_capacity?(item)
|
59
41
|
end
|
60
|
-
|
61
|
-
def
|
62
|
-
|
63
|
-
new_weight <= @weight
|
42
|
+
|
43
|
+
def fits_item?(item)
|
44
|
+
item.is_a?(Haversack::Item) && fits_capacity?(item) && fits_weight?(item)
|
64
45
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
46
|
+
alias :fits? :fits_item?
|
47
|
+
|
48
|
+
def push(item) ## TODO: Describe which constraint failed
|
49
|
+
fits_item?(item) ? super : raise(Haversack::KnapsackContentError)
|
68
50
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
51
|
+
|
52
|
+
private
|
53
|
+
def contents_exceed_weight?
|
54
|
+
weight > @max_weight
|
73
55
|
end
|
74
|
-
|
75
|
-
def
|
76
|
-
|
56
|
+
|
57
|
+
def contents_exceed_capacity?
|
58
|
+
size > @capacity
|
77
59
|
end
|
78
|
-
|
60
|
+
|
79
61
|
end
|
data/lib/haversack/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haversack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alex0112
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.0.1
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.0.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- lib/haversack.rb
|
88
88
|
- lib/haversack/err.rb
|
89
89
|
- lib/haversack/item.rb
|
90
|
+
- lib/haversack/itemcollection.rb
|
90
91
|
- lib/haversack/sack.rb
|
91
92
|
- lib/haversack/version.rb
|
92
93
|
homepage: https://github.com/alex0112/haversack
|