physical 0.4.9 → 0.5.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/CHANGELOG.md +8 -0
- data/lib/physical/package.rb +3 -2
- data/lib/physical/shipment.rb +8 -2
- data/lib/physical/spec_support/factories/location_factory.rb +3 -3
- data/lib/physical/spec_support/factories/shipment_factory.rb +6 -1
- data/lib/physical/spec_support/factories/structure_factory.rb +9 -0
- data/lib/physical/structure.rb +56 -0
- data/lib/physical/version.rb +1 -1
- data/lib/physical.rb +1 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03d9eb10ac73675e3aa2bac745e7a6d8a30f4b9c0c6cb810d4dac0235d0cc55f
|
4
|
+
data.tar.gz: ed902ddd5a9349009a43d0a883a5526f7097d759e742c6ff43b8baf904765f63
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52d08252ebda560e9abf682eb011c5e2281afbf0c3eead4acc650b9af8714555f465ffc9c613318eb2bed9e86caf72edddde1ad8edb5f26aea2233b7ebc38b96
|
7
|
+
data.tar.gz: cfdb971e4bdf9d1ce7c830b8f6da93614e630251ca7307f91baddf05353f43e1c1ef51aa84dc3db505ffb8221bf7fde68ee1e6348462e4fd9cacc9c820c2efb8
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
6
6
|
|
7
7
|
## Unreleased
|
8
8
|
|
9
|
+
## [0.5.0] - 2023-12-19
|
10
|
+
|
11
|
+
### Added
|
12
|
+
- Introduce `Physical::Structure` class [#31]
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
- Use legitimate state/zip in location factory [#30]
|
16
|
+
|
9
17
|
## [0.4.9] - 2023-08-02
|
10
18
|
|
11
19
|
### Added
|
data/lib/physical/package.rb
CHANGED
@@ -3,12 +3,13 @@
|
|
3
3
|
module Physical
|
4
4
|
class Package
|
5
5
|
extend Forwardable
|
6
|
-
attr_reader :id, :container, :items, :void_fill_density, :items_weight, :used_volume
|
6
|
+
attr_reader :id, :container, :items, :void_fill_density, :items_weight, :used_volume, :description
|
7
7
|
|
8
|
-
def initialize(id: nil, container: nil, items: [], void_fill_density: Measured::Density(0, :g_ml), dimensions: nil, weight: nil, properties: {})
|
8
|
+
def initialize(id: nil, container: nil, items: [], void_fill_density: Measured::Density(0, :g_ml), dimensions: nil, weight: nil, description: nil, properties: {})
|
9
9
|
@id = id || SecureRandom.uuid
|
10
10
|
@void_fill_density = Types::Density[void_fill_density]
|
11
11
|
@container = container || Physical::Box.new(dimensions: dimensions || [], weight: weight || Measured::Weight(0, :g), properties: properties)
|
12
|
+
@description = description
|
12
13
|
|
13
14
|
@items = Set[*items]
|
14
15
|
@items_weight = @items.map(&:weight).reduce(Measured::Weight(0, :g), &:+)
|
data/lib/physical/shipment.rb
CHANGED
@@ -7,17 +7,23 @@ module Physical
|
|
7
7
|
:destination,
|
8
8
|
:service_code,
|
9
9
|
:pallets,
|
10
|
+
:structures,
|
10
11
|
:packages,
|
11
12
|
:options
|
12
13
|
|
13
|
-
def initialize(id: nil, origin: nil, destination: nil, service_code: nil, pallets: [], packages: [], options: {})
|
14
|
+
def initialize(id: nil, origin: nil, destination: nil, service_code: nil, pallets: [], structures: [], packages: [], options: {})
|
14
15
|
@id = id || SecureRandom.uuid
|
15
16
|
@origin = origin
|
16
17
|
@destination = destination
|
17
18
|
@service_code = service_code
|
18
|
-
@
|
19
|
+
@structures = structures
|
19
20
|
@packages = packages
|
20
21
|
@options = options
|
22
|
+
|
23
|
+
return unless pallets.any?
|
24
|
+
|
25
|
+
warn "[DEPRECATION] `pallets` is deprecated. Please use `structures` instead."
|
26
|
+
@pallets = pallets
|
21
27
|
end
|
22
28
|
end
|
23
29
|
end
|
@@ -4,15 +4,15 @@ FactoryBot.define do
|
|
4
4
|
factory :physical_location, class: 'Physical::Location' do
|
5
5
|
transient do
|
6
6
|
country_code { 'US' }
|
7
|
-
region_code { '
|
7
|
+
region_code { 'VA' }
|
8
8
|
end
|
9
9
|
|
10
10
|
name { 'Jane Doe' }
|
11
11
|
company_name { 'Company' }
|
12
12
|
address1 { '11 Lovely Street' }
|
13
|
-
address2 { '
|
13
|
+
address2 { 'Suite 100' }
|
14
14
|
city { 'Herndon' }
|
15
|
-
|
15
|
+
zip { '20170' }
|
16
16
|
phone { '555-555-0199' }
|
17
17
|
email { 'jane@company.com' }
|
18
18
|
region { country.subregions.coded(region_code) }
|
@@ -4,9 +4,14 @@ FactoryBot.define do
|
|
4
4
|
factory :physical_shipment, class: "Physical::Shipment" do
|
5
5
|
origin { FactoryBot.build(:physical_location) }
|
6
6
|
destination { FactoryBot.build(:physical_location) }
|
7
|
-
pallets { build_list(:physical_pallet, 1) }
|
7
|
+
pallets { build_list(:physical_pallet, 1) } # deprecated, will be removed
|
8
8
|
packages { build_list(:physical_package, 2) }
|
9
9
|
service_code { "usps_priority_mail" }
|
10
10
|
initialize_with { new(**attributes) }
|
11
|
+
|
12
|
+
trait :freight do
|
13
|
+
structures { build_list(:physical_structure, 1) }
|
14
|
+
service_code { "tforce_freight" }
|
15
|
+
end
|
11
16
|
end
|
12
17
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
FactoryBot.define do
|
4
|
+
factory :physical_structure, class: "Physical::Structure" do
|
5
|
+
container { FactoryBot.build(:physical_pallet) }
|
6
|
+
packages { build_list(:physical_package, 2) }
|
7
|
+
initialize_with { new(**attributes) }
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Physical
|
4
|
+
class Structure
|
5
|
+
extend Forwardable
|
6
|
+
attr_reader :id, :container, :packages, :packages_weight, :used_volume
|
7
|
+
|
8
|
+
def initialize(id: nil, container: nil, packages: [], dimensions: nil, weight: nil, properties: {})
|
9
|
+
@id = id || SecureRandom.uuid
|
10
|
+
@container = container || Physical::Pallet.new(dimensions: dimensions || [], weight: weight || Measured::Weight(0, :g), properties: properties)
|
11
|
+
|
12
|
+
@packages = Set[*packages]
|
13
|
+
@packages_weight = @packages.map(&:weight).reduce(Measured::Weight(0, :g), &:+)
|
14
|
+
@used_volume = @packages.map(&:volume).reduce(Measured::Volume(0, :ml), &:+)
|
15
|
+
end
|
16
|
+
|
17
|
+
delegate [:dimensions, :width, :length, :height, :properties, :volume] => :container
|
18
|
+
|
19
|
+
def <<(other)
|
20
|
+
@packages.add(other)
|
21
|
+
@packages_weight += other.weight
|
22
|
+
@used_volume += other.volume
|
23
|
+
end
|
24
|
+
alias_method :add, :<<
|
25
|
+
|
26
|
+
def >>(other)
|
27
|
+
@packages.delete(other)
|
28
|
+
@packages_weight -= other.weight
|
29
|
+
@used_volume -= other.volume
|
30
|
+
end
|
31
|
+
alias_method :delete, :>>
|
32
|
+
|
33
|
+
def weight
|
34
|
+
container.weight + packages_weight
|
35
|
+
end
|
36
|
+
|
37
|
+
# Cost is optional. We will only return an aggregate if all packages
|
38
|
+
# have items value defined. Otherwise we will return nil.
|
39
|
+
# @return Money
|
40
|
+
def packages_value
|
41
|
+
packages_cost = packages.map(&:items_value)
|
42
|
+
packages_cost.reduce(&:+) if packages_cost.compact.size == packages_cost.size
|
43
|
+
end
|
44
|
+
|
45
|
+
def remaining_volume
|
46
|
+
container.inner_volume - used_volume
|
47
|
+
end
|
48
|
+
|
49
|
+
def density
|
50
|
+
return Measured::Density(Float::INFINITY, :g_ml) if container.volume.value.zero?
|
51
|
+
return Measured::Density(0.0, :g_ml) if container.volume.value.infinite?
|
52
|
+
|
53
|
+
Measured::Density(weight.convert_to(:g).value / container.volume.convert_to(:ml).value, :g_ml)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/physical/version.rb
CHANGED
data/lib/physical.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: physical
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Meyerhoff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: carmen
|
@@ -207,9 +207,11 @@ files:
|
|
207
207
|
- lib/physical/spec_support/factories/package_factory.rb
|
208
208
|
- lib/physical/spec_support/factories/pallet_factory.rb
|
209
209
|
- lib/physical/spec_support/factories/shipment_factory.rb
|
210
|
+
- lib/physical/spec_support/factories/structure_factory.rb
|
210
211
|
- lib/physical/spec_support/shared_examples.rb
|
211
212
|
- lib/physical/spec_support/shared_examples/a_cuboid.rb
|
212
213
|
- lib/physical/spec_support/shared_examples/has_property_readers.rb
|
214
|
+
- lib/physical/structure.rb
|
213
215
|
- lib/physical/test_support.rb
|
214
216
|
- lib/physical/types.rb
|
215
217
|
- lib/physical/version.rb
|
@@ -233,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
235
|
- !ruby/object:Gem::Version
|
234
236
|
version: '0'
|
235
237
|
requirements: []
|
236
|
-
rubygems_version: 3.4.
|
238
|
+
rubygems_version: 3.4.22
|
237
239
|
signing_key:
|
238
240
|
specification_version: 4
|
239
241
|
summary: A facade to deal with physical packages
|