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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3cf37108921d996da5627939fc13908ccb719958853a6d9620c89fb2e0a0a360
4
- data.tar.gz: 21f14e3402e28bdef0b0a4fda8504886a5a06468bf0ab11782ddba7a9ceec839
3
+ metadata.gz: ee68cfa21230115da4dccd2b313615367ae482ffbc428f8b439dbb88ec87712d
4
+ data.tar.gz: 25ef9a07cb8b920114eecb288b89eb9db0cc2072c35ecac6027fd98636b932bb
5
5
  SHA512:
6
- metadata.gz: f496dd7d39b89a525eb35eee1a26a80997d9821a8543f002f3e27b8078cec6593de424bec8582177738dee1fe637c820c532cbe8f5991e6acf52dc804ff6a5a3
7
- data.tar.gz: 0c36f081dac2c44173e92c3ebb0f24f2555d09e645976d629a831970a4b6ac59f9506222b33cdae4e904fa120cef6b3a7c45849398a7b8c1d942f8a557b5edd5
6
+ metadata.gz: c2b76426d798393318ba9c69319713284dd10f367d37166949a6d10a2ea9bf3be6980e388eef66cf8c747e39f937c8d65b1126cf3409343f54dd3dd29541216a
7
+ data.tar.gz: 6d0399fecfa4b92a0e85065023762d332aefcce21e60c1ed3c1f33c5c2da3e16203261f0101a875c67866f889a6a7212790e4cbf7bfb9186a14ee91f62df74a2
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
  # Haversack
2
+ [![Build Status](https://travis-ci.org/alex0112/haversack.svg?branch=master)](https://travis-ci.org/alex0112/haversack) [![Maintainability](https://api.codeclimate.com/v1/badges/7ff5206188bb44910d07/maintainability)](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/[USERNAME]/haversack.
57
+ Bug reports and pull requests are welcome on GitHub at https://github.com/alex0112/haversack.
56
58
 
57
59
  ## License
58
60
 
@@ -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.16"
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"
@@ -3,4 +3,5 @@ module Haversack
3
3
  require "haversack/sack"
4
4
  require "haversack/item"
5
5
  require "haversack/err"
6
+ require "haversack/itemcollection"
6
7
  end
@@ -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
@@ -1,79 +1,61 @@
1
- class Sack
2
- include Enumerable
1
+ require 'haversack/itemcollection'
3
2
 
4
- attr_reader :capacity, :weight, :available_capacity, :current_weight, :contents
3
+ class Sack < Haversack::ItemCollection
5
4
 
6
- def initialize(capacity:, weight:, contents: nil)
7
- @capacity = capacity
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 contents=(new_contents)
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
- @contents = new_contents
24
- end
25
-
26
- def has_non_items?(contents) ## TODO: Consider refactor: Static method? Doesn't rely on instance data.
27
- contents.any? { |e| !e.is_a? Haversack::Item }
28
- end
29
-
30
- def current_weight
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
- ## TODO: the *fit* methods duplicate behavior. Consolidate them in a future itteration.
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
- @contents.empty? ? @capacity : (@capacity - @contents.length)
24
+ empty? ? @capacity : (@capacity - size)
42
25
  end
43
26
 
44
- def fits_item_capacity?(item)
45
- item.size < @available_capacity
27
+ def fits_weight?(item)
28
+ item.weight <= available_weight
46
29
  end
47
30
 
48
- def fits_item?(item)
49
- (item.is_a? Haversack::Item) && (fits_item_capacity?(item) && fits_item_weight?(item))
31
+ def exceeds_weight?(item)
32
+ !fits_weight?(item)
50
33
  end
51
-
52
- def push(item) ## TODO: Return an error that describes which constraint failed
53
- fits_item? item ? @contents.push(item) : raise(Haversack::KnapsackContentError)
54
- @contents
34
+
35
+ def fits_capacity?(item)
36
+ item.size <= available_capacity
55
37
  end
56
38
 
57
- def fits_contents?(contents)
58
- fits_weight?(contents) && fits_capacity?(contents)
39
+ def exceeds_capacity?(item)
40
+ !fits_capacity?(item)
59
41
  end
60
-
61
- def fits_weight?(contents)
62
- new_weight = contents.map { |item| item.weight }.sum
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
- def exceeds_weight?(contents)
67
- !fits_weight? contents
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
- def fits_capacity?(contents)
71
- new_capacity = contents.map { |item| item.size }.sum
72
- new_capacity <= @capacity
51
+
52
+ private
53
+ def contents_exceed_weight?
54
+ weight > @max_weight
73
55
  end
74
-
75
- def exceeds_capacity?(contents)
76
- !fits_capacity? contents
56
+
57
+ def contents_exceed_capacity?
58
+ size > @capacity
77
59
  end
78
-
60
+
79
61
  end
@@ -1,3 +1,3 @@
1
1
  module Haversack
2
- VERSION = "0.3.0"
2
+ VERSION = "1.0.0"
3
3
  end
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.3.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: 2018-12-22 00:00:00.000000000 Z
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: '1.16'
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: '1.16'
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