ivymeter 0.1.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.
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IvyMeter
4
+ module Prop
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ def prop(name, json_name, _csv_name, type: :string)
11
+ define_method(name) do
12
+ value = @data[json_name]
13
+ return nil if value.nil?
14
+
15
+ case type
16
+ when :date
17
+ Date.parse(value)
18
+ when :datetime
19
+ value.is_a?(DateTime) ? value : DateTime.parse(value)
20
+ else
21
+ value
22
+ end
23
+ end
24
+
25
+ define_method("#{name}=") do |value|
26
+ return @data[json_name] = nil if value.nil?
27
+
28
+ @data[json_name] = case type
29
+ when :date
30
+ value.is_a?(Date) ? value : Date.parse(value)
31
+ when :datetime
32
+ if value.is_a?(DateTime)
33
+ value
34
+ else
35
+ begin
36
+ DateTime.parse(value)
37
+ rescue ArgumentError
38
+ DateTime.iso8601(value)
39
+ end
40
+ end
41
+ else
42
+ value
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IvyMeter
4
+ VERSION = '0.1.0'
5
+ end
data/lib/ivymeter.rb ADDED
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'ivymeter/version'
4
+ require_relative 'ivymeter/opcode'
5
+ require_relative 'ivymeter/opcodes'
6
+ require_relative 'ivymeter/events/base'
7
+ require_relative 'ivymeter/events/container'
8
+ require_relative 'ivymeter/events/tray'
9
+ require_relative 'ivymeter/events/bundle'
10
+ require_relative 'ivymeter/events/piece'
11
+
12
+ module IvyMeter
13
+ class Error < StandardError; end
14
+ # Your code goes here...
15
+ end
@@ -0,0 +1,94 @@
1
+ module IvyMeter
2
+ class Event
3
+ include Prop
4
+
5
+ def self.inherited: (Class subclass) -> void
6
+ def self.property_mappings: () -> Hash[Symbol, Hash[Symbol, untyped]]
7
+ def self.from_json: (Hash[String, untyped] json_data) -> Event
8
+ def self.from_csv: (Hash[String, untyped] row) -> Event
9
+
10
+ def to_json: () -> String
11
+ def actual?: () -> bool
12
+ def assumed_actual?: () -> bool
13
+ def logical?: () -> bool
14
+ def assumed_logical?: () -> bool
15
+ def assumed?: () -> bool
16
+ def opcode: () -> IvyMeter::OpCode?
17
+ def stop_the_clock_scan?: () -> bool
18
+ def unexpected_opcode?: () -> bool
19
+ def clearance_cutoff_time: () -> String?
20
+ def mail_phase: () -> String?
21
+ def process_description: () -> String?
22
+
23
+ # Common properties
24
+ attr_accessor edoc_job_id: String?
25
+ attr_accessor edoc_mailing_group_id: String?
26
+ attr_accessor edoc_submitter_crid: String?
27
+
28
+ # Handling event properties
29
+ attr_accessor scan_datetime: DateTime?
30
+ attr_accessor scan_event_code: String?
31
+ attr_accessor scan_facility_city: String?
32
+ attr_accessor scan_facility_name: String?
33
+ attr_accessor scan_facility_state: String?
34
+ attr_accessor scan_facility_zip: String?
35
+ attr_accessor scan_locale_key: String?
36
+ attr_accessor handling_event_type: String?
37
+ attr_accessor handling_event_type_description: String?
38
+
39
+ # Mail properties
40
+ attr_accessor mail_class_description: String?
41
+ attr_accessor mail_shape_description: String?
42
+
43
+ # Scanner properties
44
+ attr_accessor scanner_type: String?
45
+ attr_accessor machine_name: String?
46
+ attr_accessor device_id: String?
47
+
48
+ # Start the clock properties
49
+ attr_accessor start_the_clock_date: Date?
50
+ attr_accessor start_the_clock_facility_address: String?
51
+ attr_accessor start_the_clock_facility_city: String?
52
+ attr_accessor start_the_clock_facility_locale_key: String?
53
+ attr_accessor start_the_clock_facility_name: String?
54
+ attr_accessor start_the_clock_facility_state: String?
55
+ attr_accessor start_the_clock_facility_zip: String?
56
+
57
+ # Recipient CRID properties
58
+ attr_accessor recipient_crid_of_mid_on_piece: String?
59
+ attr_accessor recipient_crid_of_mid_on_piece_delegator: String?
60
+ attr_accessor recipient_mail_owner_crid: String?
61
+ attr_accessor recipient_mail_owner_delegator_crid: String?
62
+ attr_accessor recipient_routing_code_authorized_crid: String?
63
+
64
+ # Operational status
65
+ attr_accessor operational_status: String?
66
+
67
+ # Common handling event properties
68
+ attr_accessor handling_event_datetime: String?
69
+ attr_accessor handling_event_facility_city: String?
70
+ attr_accessor handling_event_facility_name: String?
71
+ attr_accessor handling_event_facility_state: String?
72
+ attr_accessor handling_event_facility_zip: String?
73
+ attr_accessor handling_event_locale_key: String?
74
+ attr_accessor handling_event_scan_state: String?
75
+ attr_accessor handling_event_code: String?
76
+
77
+ # Common eDoc properties
78
+ attr_accessor edoc_container_id: String?
79
+ attr_accessor edoc_csa_agreement_id: String?
80
+ attr_accessor edoc_customer_group_id: String?
81
+ attr_accessor edoc_parent_container_id: String?
82
+ attr_accessor edoc_sibling_container_id: String?
83
+ attr_accessor edoc_user_license_code: String?
84
+
85
+ # Common recipient CRID properties
86
+ attr_accessor recipient_edoc_submitter_crid: String?
87
+ attr_accessor recipient_edoc_submitter_delegator_crid: String?
88
+ attr_accessor recipient_mail_preparer_crid: String?
89
+ attr_accessor recipient_mail_preparer_delegator_crid: String?
90
+
91
+ # Common mail properties
92
+ attr_accessor piece_count: String?
93
+ end
94
+ end
@@ -0,0 +1,33 @@
1
+ module IvyMeter
2
+ class Event::BundleEvent < Event
3
+ # Bundle-specific properties
4
+ attr_accessor bundle_id: String?
5
+ attr_accessor edoc_container_id: String?
6
+ attr_accessor edoc_container_zip: String?
7
+ attr_accessor edoc_csa_agreement_id: String?
8
+ attr_accessor edoc_customer_group_id: String?
9
+ attr_accessor edoc_parent_container_id: String?
10
+ attr_accessor edoc_sibling_container_id: String?
11
+ attr_accessor edoc_user_license_code: String?
12
+ attr_accessor piece_count: String?
13
+
14
+ # Bundle IMb properties
15
+ attr_accessor imb: String?
16
+ attr_accessor imb_mid: String?
17
+ attr_accessor imb_routing_code: String?
18
+ attr_accessor imb_serial_number: String?
19
+ attr_accessor imb_stid: String?
20
+ attr_accessor imb_tracking_code: String?
21
+
22
+ # Bundle-specific recipient CRID properties
23
+ attr_accessor recipient_crid_of_mid_on_bundle: String?
24
+ attr_accessor recipient_crid_of_mid_on_bundle_delegator: String?
25
+
26
+ # Postage statement properties
27
+ attr_accessor postage_statement_finalization_datetime: DateTime?
28
+ attr_accessor postage_statement_finalization_facility_name: String?
29
+
30
+ # Routing code
31
+ attr_accessor routing_code_imb_matching_portion: String?
32
+ end
33
+ end
@@ -0,0 +1,48 @@
1
+ module IvyMeter
2
+ class Event::ContainerEvent < Event
3
+ # Container-specific properties
4
+ attr_accessor container_id: String?
5
+ attr_accessor bundle_count: String?
6
+ attr_accessor edoc_container_id: String?
7
+ attr_accessor edoc_container_zip: String?
8
+ attr_accessor edoc_csa_agreement_id: String?
9
+ attr_accessor edoc_customer_group_id: String?
10
+ attr_accessor edoc_parent_container_id: String?
11
+ attr_accessor edoc_sibling_container_id: String?
12
+ attr_accessor edoc_user_license_code: String?
13
+
14
+ # FAST appointment properties
15
+ attr_accessor fast_appointment_scheduled_datetime: DateTime?
16
+ attr_accessor fast_appointment_unload_end_time: DateTime?
17
+ attr_accessor fast_appointment_unload_start_time: DateTime?
18
+
19
+ # Count properties
20
+ attr_accessor piece_count: String?
21
+ attr_accessor tray_count: String?
22
+
23
+ # Container IMb properties
24
+ attr_accessor imcb: String?
25
+ attr_accessor imcb_mid: String?
26
+ attr_accessor imcb_routing_code: String?
27
+ attr_accessor imcb_serial_number: String?
28
+ attr_accessor imcb_stid: String?
29
+ attr_accessor imcb_tracking_code: String?
30
+
31
+ # Container-specific recipient CRID properties
32
+ attr_accessor recipient_crid_of_mid_on_container: String?
33
+ attr_accessor recipient_crid_of_mid_on_container_delegator: String?
34
+ attr_accessor recipient_fast_scheduler_crid: String?
35
+ attr_accessor recipient_fast_scheduler_delegator_crid: String?
36
+
37
+ # Parent references
38
+ attr_accessor parent_tray_edoc_container_id: String?
39
+ attr_accessor parent_tray_edoc_imtb: String?
40
+
41
+ # Postage statement properties
42
+ attr_accessor postage_statement_finalization_datetime: DateTime?
43
+ attr_accessor postage_statement_finalization_facility_name: String?
44
+
45
+ # Routing code
46
+ attr_accessor routing_code_imcb_matching_portion: String?
47
+ end
48
+ end
@@ -0,0 +1,46 @@
1
+ module IvyMeter
2
+ class Event::PieceEvent < Event
3
+ # Delivery date properties
4
+ attr_accessor anticipated_delivery_date: Date?
5
+ attr_accessor expected_delivery_date: Date?
6
+ attr_accessor predicted_delivery_date: Date?
7
+
8
+ # IMb properties
9
+ attr_accessor imb: String?
10
+ attr_accessor imb_mid: String?
11
+ attr_accessor imb_routing_code: String?
12
+ attr_accessor imb_serial_number: String?
13
+ attr_accessor imb_stid: String?
14
+ attr_accessor imb_tracking_code: String?
15
+
16
+ # IMpb properties
17
+ attr_accessor impb: String?
18
+
19
+ # LDE properties
20
+ attr_accessor lde_delivery_mode: String?
21
+ attr_accessor lde_inventory_method: String?
22
+ attr_accessor lde_trigger_method: String?
23
+
24
+ # Mail phase
25
+ attr_accessor mail_phase: String?
26
+
27
+ # Operational status
28
+ attr_accessor operational_status: String?
29
+
30
+ # Parent references
31
+ attr_accessor parent_container_edoc_container_id: String?
32
+ attr_accessor parent_container_edoc_imtb: String?
33
+ attr_accessor parent_tray_edoc_container_id: String?
34
+ attr_accessor parent_tray_edoc_imtb: String?
35
+
36
+ # Piece identifier
37
+ attr_accessor piece_id: String?
38
+
39
+ # Postage statement properties
40
+ attr_accessor postage_statement_finalization_datetime: DateTime?
41
+ attr_accessor postage_statement_finalization_facility_name: String?
42
+
43
+ # Routing code
44
+ attr_accessor routing_code_imb_matching_portion: String?
45
+ end
46
+ end
@@ -0,0 +1,37 @@
1
+ module IvyMeter
2
+ class Event::TrayEvent < Event
3
+ # Tray-specific properties
4
+ attr_accessor tray_id: String?
5
+ attr_accessor edoc_container_id: String?
6
+ attr_accessor edoc_container_zip: String?
7
+ attr_accessor edoc_csa_agreement_id: String?
8
+ attr_accessor edoc_customer_group_id: String?
9
+ attr_accessor edoc_parent_container_id: String?
10
+ attr_accessor edoc_sibling_container_id: String?
11
+ attr_accessor edoc_user_license_code: String?
12
+ attr_accessor piece_count: String?
13
+
14
+ # Tray IMb properties
15
+ attr_accessor imtb: String?
16
+ attr_accessor imtb_mid: String?
17
+ attr_accessor imtb_routing_code: String?
18
+ attr_accessor imtb_serial_number: String?
19
+ attr_accessor imtb_stid: String?
20
+ attr_accessor imtb_tracking_code: String?
21
+
22
+ # Tray-specific recipient CRID properties
23
+ attr_accessor recipient_crid_of_mid_on_tray: String?
24
+ attr_accessor recipient_crid_of_mid_on_tray_delegator: String?
25
+
26
+ # Parent references
27
+ attr_accessor parent_bundle_edoc_container_id: String?
28
+ attr_accessor parent_bundle_edoc_imb: String?
29
+
30
+ # Postage statement properties
31
+ attr_accessor postage_statement_finalization_datetime: DateTime?
32
+ attr_accessor postage_statement_finalization_facility_name: String?
33
+
34
+ # Routing code
35
+ attr_accessor routing_code_imtb_matching_portion: String?
36
+ end
37
+ end
@@ -0,0 +1,18 @@
1
+ module IvyMeter
2
+ module Prop
3
+ def self.included: (Module base) -> void
4
+
5
+ module ClassMethods
6
+ def prop: (
7
+ Symbol name,
8
+ String json_name,
9
+ String csv_name,
10
+ ?type: (:string | :date | :datetime)
11
+ ) -> void
12
+ end
13
+
14
+ def initialize: () -> void
15
+ def []: (String key) -> untyped
16
+ def []=: (String key, untyped value) -> untyped
17
+ end
18
+ end
data/sig/ivymeter.rbs ADDED
@@ -0,0 +1,136 @@
1
+ module IvyMeter
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+
5
+ class Error < StandardError
6
+ end
7
+
8
+ class Event
9
+ include Prop
10
+
11
+ def self.inherited: (Class) -> void
12
+ def self.prop: (Symbol name, String json_name, String csv_name, ?type: Symbol) -> void
13
+ def self.property_mappings: () -> Hash[Symbol, Hash[Symbol, untyped]]
14
+ def self.from_json: (Hash[Symbol, untyped] json_data) -> Event
15
+ def self.from_csv: (Hash[Symbol, untyped] row) -> Event
16
+
17
+ def to_json: () -> String
18
+ def actual?: () -> bool
19
+ def assumed_actual?: () -> bool
20
+ def logical?: () -> bool
21
+ def assumed_logical?: () -> bool
22
+ def assumed?: () -> bool
23
+ def opcode: () -> untyped
24
+ def stop_the_clock_scan?: () -> bool
25
+ def unexpected_opcode?: () -> bool
26
+ def clearance_cutoff_time: () -> untyped
27
+ def mail_phase: () -> untyped
28
+ def process_description: () -> untyped
29
+ end
30
+
31
+ class Event::ContainerEvent < Event
32
+ attr_accessor container_id: String
33
+ attr_accessor bundle_count: Integer
34
+ attr_accessor edoc_container_id: String
35
+ attr_accessor edoc_container_zip: String
36
+ attr_accessor edoc_csa_agreement_id: String
37
+ attr_accessor edoc_customer_group_id: String
38
+ attr_accessor edoc_parent_container_id: String
39
+ attr_accessor edoc_sibling_container_id: String
40
+ attr_accessor edoc_user_license_code: String
41
+ attr_accessor fast_appointment_scheduled_datetime: Time
42
+ attr_accessor fast_appointment_unload_end_time: Time
43
+ attr_accessor fast_appointment_unload_start_time: Time
44
+ attr_accessor piece_count: Integer
45
+ attr_accessor tray_count: Integer
46
+ attr_accessor imcb: String
47
+ attr_accessor imcb_mid: String
48
+ attr_accessor imcb_routing_code: String
49
+ attr_accessor imcb_serial_number: String
50
+ attr_accessor imcb_stid: String
51
+ attr_accessor imcb_tracking_code: String
52
+ attr_accessor recipient_crid_of_mid_on_container: String
53
+ attr_accessor recipient_crid_of_mid_on_container_delegator: String
54
+ attr_accessor recipient_fast_scheduler_crid: String
55
+ attr_accessor recipient_fast_scheduler_delegator_crid: String
56
+ attr_accessor parent_tray_edoc_container_id: String
57
+ attr_accessor parent_tray_edoc_imtb: String
58
+ attr_accessor postage_statement_finalization_datetime: Time
59
+ attr_accessor postage_statement_finalization_facility_name: String
60
+ attr_accessor routing_code_imcb_matching_portion: String
61
+ end
62
+
63
+ class Event::TrayEvent < Event
64
+ attr_accessor tray_id: String
65
+ attr_accessor edoc_container_id: String
66
+ attr_accessor edoc_container_zip: String
67
+ attr_accessor edoc_csa_agreement_id: String
68
+ attr_accessor edoc_customer_group_id: String
69
+ attr_accessor edoc_parent_container_id: String
70
+ attr_accessor edoc_sibling_container_id: String
71
+ attr_accessor edoc_user_license_code: String
72
+ attr_accessor piece_count: Integer
73
+ attr_accessor imtb: String
74
+ attr_accessor imtb_mid: String
75
+ attr_accessor imtb_routing_code: String
76
+ attr_accessor imtb_serial_number: String
77
+ attr_accessor imtb_stid: String
78
+ attr_accessor imtb_tracking_code: String
79
+ attr_accessor recipient_crid_of_mid_on_tray: String
80
+ attr_accessor recipient_crid_of_mid_on_tray_delegator: String
81
+ attr_accessor parent_bundle_edoc_container_id: String
82
+ attr_accessor parent_bundle_edoc_imb: String
83
+ attr_accessor postage_statement_finalization_datetime: Time
84
+ attr_accessor postage_statement_finalization_facility_name: String
85
+ attr_accessor routing_code_imtb_matching_portion: String
86
+ end
87
+
88
+ class Event::BundleEvent < Event
89
+ attr_accessor bundle_id: String
90
+ attr_accessor edoc_container_id: String
91
+ attr_accessor edoc_container_zip: String
92
+ attr_accessor edoc_csa_agreement_id: String
93
+ attr_accessor edoc_customer_group_id: String
94
+ attr_accessor edoc_parent_container_id: String
95
+ attr_accessor edoc_sibling_container_id: String
96
+ attr_accessor edoc_user_license_code: String
97
+ attr_accessor piece_count: Integer
98
+ attr_accessor imb: String
99
+ attr_accessor imb_mid: String
100
+ attr_accessor imb_routing_code: String
101
+ attr_accessor imb_serial_number: String
102
+ attr_accessor imb_stid: String
103
+ attr_accessor imb_tracking_code: String
104
+ attr_accessor recipient_crid_of_mid_on_bundle: String
105
+ attr_accessor recipient_crid_of_mid_on_bundle_delegator: String
106
+ attr_accessor postage_statement_finalization_datetime: Time
107
+ attr_accessor postage_statement_finalization_facility_name: String
108
+ attr_accessor routing_code_imb_matching_portion: String
109
+ end
110
+
111
+ class Event::PieceEvent < Event
112
+ attr_accessor anticipated_delivery_date: Date
113
+ attr_accessor expected_delivery_date: Date
114
+ attr_accessor predicted_delivery_date: Date
115
+ attr_accessor imb: String
116
+ attr_accessor imb_mid: String
117
+ attr_accessor imb_routing_code: String
118
+ attr_accessor imb_serial_number: String
119
+ attr_accessor imb_stid: String
120
+ attr_accessor imb_tracking_code: String
121
+ attr_accessor impb: String
122
+ attr_accessor lde_delivery_mode: String
123
+ attr_accessor lde_inventory_method: String
124
+ attr_accessor lde_trigger_method: String
125
+ attr_accessor mail_phase: String
126
+ attr_accessor operational_status: String
127
+ attr_accessor parent_container_edoc_container_id: String
128
+ attr_accessor parent_container_edoc_imtb: String
129
+ attr_accessor parent_tray_edoc_container_id: String
130
+ attr_accessor parent_tray_edoc_imtb: String
131
+ attr_accessor piece_id: String
132
+ attr_accessor postage_statement_finalization_datetime: Time
133
+ attr_accessor postage_statement_finalization_facility_name: String
134
+ attr_accessor routing_code_imb_matching_portion: String
135
+ end
136
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ivymeter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - nora
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 2025-04-14 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: xsv
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.0'
26
+ email:
27
+ - nora@hackclub.com
28
+ executables:
29
+ - generate_operation_codes
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - ".rspec"
34
+ - ".rubocop.yml"
35
+ - CHANGELOG.md
36
+ - README.md
37
+ - Rakefile
38
+ - exe/generate_operation_codes
39
+ - lib/ivymeter.rb
40
+ - lib/ivymeter/events/base.rb
41
+ - lib/ivymeter/events/bundle.rb
42
+ - lib/ivymeter/events/container.rb
43
+ - lib/ivymeter/events/piece.rb
44
+ - lib/ivymeter/events/tray.rb
45
+ - lib/ivymeter/opcode.rb
46
+ - lib/ivymeter/opcodes.rb
47
+ - lib/ivymeter/prop.rb
48
+ - lib/ivymeter/version.rb
49
+ - sig/ivymeter.rbs
50
+ - sig/ivymeter/events/base.rbs
51
+ - sig/ivymeter/events/bundle.rbs
52
+ - sig/ivymeter/events/container.rbs
53
+ - sig/ivymeter/events/piece.rbs
54
+ - sig/ivymeter/events/tray.rbs
55
+ - sig/ivymeter/prop.rbs
56
+ homepage: https://github.com/24c02/ivymeter
57
+ licenses: []
58
+ metadata:
59
+ allowed_push_host: https://rubygems.org
60
+ homepage_uri: https://github.com/24c02/ivymeter
61
+ source_code_uri: https://github.com/yourusername/ivymeter
62
+ changelog_uri: https://github.com/yourusername/ivymeter/blob/main/CHANGELOG.md
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 3.1.0
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubygems_version: 3.6.2
78
+ specification_version: 4
79
+ summary: data classes for USPS' IV-MTR
80
+ test_files: []