haversack 0.3.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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