logstruct 0.1.0 → 0.1.1

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.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -1
  3. data/README.md +15 -2
  4. data/lib/log_struct/boot_buffer.rb +28 -0
  5. data/lib/log_struct/builders/active_job.rb +84 -0
  6. data/lib/log_struct/concerns/configuration.rb +126 -13
  7. data/lib/log_struct/concerns/error_handling.rb +3 -7
  8. data/lib/log_struct/config_struct/filters.rb +18 -0
  9. data/lib/log_struct/config_struct/integrations.rb +8 -12
  10. data/lib/log_struct/configuration.rb +13 -0
  11. data/lib/log_struct/enums/event.rb +13 -0
  12. data/lib/log_struct/enums/log_field.rb +154 -0
  13. data/lib/log_struct/enums/source.rb +4 -1
  14. data/lib/log_struct/formatter.rb +29 -17
  15. data/lib/log_struct/integrations/action_mailer/error_handling.rb +3 -11
  16. data/lib/log_struct/integrations/action_mailer/event_logging.rb +22 -12
  17. data/lib/log_struct/integrations/active_job/log_subscriber.rb +52 -48
  18. data/lib/log_struct/integrations/active_model_serializers.rb +8 -14
  19. data/lib/log_struct/integrations/active_record.rb +35 -5
  20. data/lib/log_struct/integrations/active_storage.rb +59 -20
  21. data/lib/log_struct/integrations/ahoy.rb +2 -1
  22. data/lib/log_struct/integrations/carrierwave.rb +13 -16
  23. data/lib/log_struct/integrations/dotenv.rb +278 -0
  24. data/lib/log_struct/integrations/good_job/log_subscriber.rb +86 -136
  25. data/lib/log_struct/integrations/good_job/logger.rb +8 -10
  26. data/lib/log_struct/integrations/good_job.rb +5 -7
  27. data/lib/log_struct/integrations/host_authorization.rb +25 -4
  28. data/lib/log_struct/integrations/lograge.rb +20 -14
  29. data/lib/log_struct/integrations/puma.rb +482 -0
  30. data/lib/log_struct/integrations/rack_error_handler/middleware.rb +11 -18
  31. data/lib/log_struct/integrations/shrine.rb +44 -19
  32. data/lib/log_struct/integrations/sorbet.rb +48 -0
  33. data/lib/log_struct/integrations.rb +21 -0
  34. data/lib/log_struct/log/action_mailer/delivered.rb +99 -0
  35. data/lib/log_struct/log/action_mailer/delivery.rb +99 -0
  36. data/lib/log_struct/log/action_mailer.rb +30 -45
  37. data/lib/log_struct/log/active_job/enqueue.rb +125 -0
  38. data/lib/log_struct/log/active_job/finish.rb +130 -0
  39. data/lib/log_struct/log/active_job/schedule.rb +125 -0
  40. data/lib/log_struct/log/active_job/start.rb +130 -0
  41. data/lib/log_struct/log/active_job.rb +41 -54
  42. data/lib/log_struct/log/active_model_serializers.rb +72 -33
  43. data/lib/log_struct/log/active_storage/delete.rb +87 -0
  44. data/lib/log_struct/log/active_storage/download.rb +103 -0
  45. data/lib/log_struct/log/active_storage/exist.rb +93 -0
  46. data/lib/log_struct/log/active_storage/metadata.rb +93 -0
  47. data/lib/log_struct/log/active_storage/stream.rb +93 -0
  48. data/lib/log_struct/log/active_storage/upload.rb +118 -0
  49. data/lib/log_struct/log/active_storage/url.rb +93 -0
  50. data/lib/log_struct/log/active_storage.rb +32 -68
  51. data/lib/log_struct/log/ahoy.rb +67 -33
  52. data/lib/log_struct/log/carrierwave/delete.rb +115 -0
  53. data/lib/log_struct/log/carrierwave/download.rb +131 -0
  54. data/lib/log_struct/log/carrierwave/upload.rb +141 -0
  55. data/lib/log_struct/log/carrierwave.rb +37 -72
  56. data/lib/log_struct/log/dotenv/load.rb +76 -0
  57. data/lib/log_struct/log/dotenv/restore.rb +76 -0
  58. data/lib/log_struct/log/dotenv/save.rb +76 -0
  59. data/lib/log_struct/log/dotenv/update.rb +76 -0
  60. data/lib/log_struct/log/dotenv.rb +12 -0
  61. data/lib/log_struct/log/error.rb +58 -47
  62. data/lib/log_struct/log/good_job/enqueue.rb +126 -0
  63. data/lib/log_struct/log/good_job/error.rb +151 -0
  64. data/lib/log_struct/log/good_job/finish.rb +136 -0
  65. data/lib/log_struct/log/good_job/log.rb +131 -0
  66. data/lib/log_struct/log/good_job/schedule.rb +136 -0
  67. data/lib/log_struct/log/good_job/start.rb +136 -0
  68. data/lib/log_struct/log/good_job.rb +40 -141
  69. data/lib/log_struct/log/interfaces/additional_data_field.rb +1 -17
  70. data/lib/log_struct/log/interfaces/common_fields.rb +1 -39
  71. data/lib/log_struct/log/interfaces/public_common_fields.rb +1 -28
  72. data/lib/log_struct/log/interfaces/request_fields.rb +1 -33
  73. data/lib/log_struct/log/plain.rb +59 -34
  74. data/lib/log_struct/log/puma/shutdown.rb +80 -0
  75. data/lib/log_struct/log/puma/start.rb +120 -0
  76. data/lib/log_struct/log/puma.rb +10 -0
  77. data/lib/log_struct/log/request.rb +132 -48
  78. data/lib/log_struct/log/security/blocked_host.rb +141 -0
  79. data/lib/log_struct/log/security/csrf_violation.rb +131 -0
  80. data/lib/log_struct/log/security/ip_spoof.rb +141 -0
  81. data/lib/log_struct/log/security.rb +40 -70
  82. data/lib/log_struct/log/shared/add_request_fields.rb +1 -26
  83. data/lib/log_struct/log/shared/merge_additional_data_fields.rb +1 -22
  84. data/lib/log_struct/log/shared/serialize_common.rb +1 -33
  85. data/lib/log_struct/log/shared/serialize_common_public.rb +9 -9
  86. data/lib/log_struct/log/shrine/delete.rb +85 -0
  87. data/lib/log_struct/log/shrine/download.rb +90 -0
  88. data/lib/log_struct/log/shrine/exist.rb +90 -0
  89. data/lib/log_struct/log/shrine/metadata.rb +90 -0
  90. data/lib/log_struct/log/shrine/upload.rb +105 -0
  91. data/lib/log_struct/log/shrine.rb +10 -67
  92. data/lib/log_struct/log/sidekiq.rb +65 -26
  93. data/lib/log_struct/log/sql.rb +113 -106
  94. data/lib/log_struct/log.rb +29 -36
  95. data/lib/log_struct/multi_error_reporter.rb +80 -22
  96. data/lib/log_struct/param_filters.rb +50 -7
  97. data/lib/log_struct/rails_boot_banner_silencer.rb +123 -0
  98. data/lib/log_struct/railtie.rb +71 -0
  99. data/lib/log_struct/semantic_logger/formatter.rb +4 -2
  100. data/lib/log_struct/semantic_logger/setup.rb +34 -18
  101. data/lib/log_struct/shared/interfaces/additional_data_field.rb +22 -0
  102. data/lib/log_struct/shared/interfaces/common_fields.rb +39 -0
  103. data/lib/log_struct/shared/interfaces/public_common_fields.rb +29 -0
  104. data/lib/log_struct/shared/interfaces/request_fields.rb +39 -0
  105. data/lib/log_struct/shared/shared/add_request_fields.rb +28 -0
  106. data/lib/log_struct/shared/shared/merge_additional_data_fields.rb +27 -0
  107. data/lib/log_struct/shared/shared/serialize_common.rb +58 -0
  108. data/lib/log_struct/version.rb +1 -1
  109. data/lib/log_struct.rb +22 -4
  110. data/logstruct.gemspec +2 -1
  111. metadata +78 -9
  112. data/lib/log_struct/log/interfaces/message_field.rb +0 -20
  113. data/lib/log_struct/log_keys.rb +0 -102
@@ -1,53 +1,87 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require_relative "interfaces/common_fields"
5
- require_relative "interfaces/additional_data_field"
6
- require_relative "shared/serialize_common"
7
- require_relative "shared/merge_additional_data_fields"
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
8
15
  require_relative "../enums/source"
9
16
  require_relative "../enums/event"
10
17
  require_relative "../enums/level"
11
- require_relative "../log_keys"
18
+ require_relative "../enums/log_field"
12
19
 
13
20
  module LogStruct
14
21
  module Log
15
- # Ahoy analytics log entry for structured logging
16
22
  class Ahoy < T::Struct
17
- extend T::Sig
23
+ # typed: strict
24
+ # frozen_string_literal: true
18
25
 
19
- include Interfaces::CommonFields
20
- include Interfaces::AdditionalDataField
21
- include SerializeCommon
22
- include MergeAdditionalDataFields
26
+ extend T::Sig
23
27
 
24
- # Events are generic logs for tracking
25
- AhoyEvent = T.type_alias {
26
- Event::Log
27
- }
28
+ extend T::Sig
28
29
 
29
- # Common fields
30
- const :source, Source, default: T.let(Source::App, Source)
31
- const :event, AhoyEvent, default: T.let(Event::Log, AhoyEvent)
32
- const :level, Level, default: T.let(Level::Info, Level)
30
+ # Shared/common fields
31
+ const :source, Source::App, default: Source::App
32
+ const :event, Event, default: Event::Log
33
33
  const :timestamp, Time, factory: -> { Time.now }
34
+ const :level, Level, default: Level::Info
34
35
 
35
- # Ahoy specifics
36
- const :message, String, default: "ahoy.track"
37
- const :ahoy_event, T.nilable(String), default: nil
36
+ # Event-specific fields
37
+ const :message, String
38
+ const :ahoy_event, String
38
39
  const :properties, T.nilable(T::Hash[Symbol, T.untyped]), default: nil
39
40
 
40
- # Extra data
41
- const :additional_data, T::Hash[Symbol, T.untyped], default: {}
42
-
43
- sig { override.params(strict: T::Boolean).returns(T::Hash[Symbol, T.untyped]) }
44
- def serialize(strict = true)
45
- hash = serialize_common(strict)
46
- merge_additional_data_fields(hash)
47
- hash[LOG_KEYS.fetch(:message)] = message
48
- hash[:ahoy_event] = ahoy_event if ahoy_event
49
- hash[:properties] = properties if properties
50
- hash
41
+ # Additional data
42
+ include LogStruct::Log::Interfaces::AdditionalDataField
43
+ const :additional_data, T.nilable(T::Hash[T.any(String, Symbol), T.untyped]), default: nil
44
+ include LogStruct::Log::Shared::MergeAdditionalDataFields
45
+
46
+ # Request fields (optional)
47
+
48
+ # Serialize shared fields
49
+ include LogStruct::Log::Interfaces::CommonFields
50
+ include LogStruct::Log::Shared::SerializeCommon
51
+
52
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
53
+ def self.base_hash
54
+ {}
55
+ end
56
+
57
+ sig {
58
+ params(message: T.untyped,
59
+ ahoy_event: T.untyped,
60
+ properties: T.untyped,
61
+ additional_data: T.untyped,
62
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
63
+ }
64
+ def self.build(message:,
65
+ ahoy_event:,
66
+ properties: nil,
67
+ additional_data: nil,
68
+ timestamp: Time.now)
69
+ h = base_hash
70
+ h[LogField::Message] = message
71
+ h[LogField::AhoyEvent] = ahoy_event
72
+ h[LogField::Properties] = properties unless properties.nil?
73
+ h
74
+ end
75
+
76
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
77
+ def to_h
78
+ self.class.build(
79
+ message: message,
80
+ ahoy_event: ahoy_event,
81
+ properties: properties,
82
+ additional_data: additional_data,
83
+ timestamp: timestamp
84
+ )
51
85
  end
52
86
  end
53
87
  end
@@ -0,0 +1,115 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
15
+ require_relative "../../enums/source"
16
+ require_relative "../../enums/event"
17
+ require_relative "../../enums/level"
18
+ require_relative "../../enums/log_field"
19
+
20
+ module LogStruct
21
+ module Log
22
+ class CarrierWave
23
+ class Delete < T::Struct
24
+ # typed: strict
25
+ # frozen_string_literal: true
26
+
27
+ extend T::Sig
28
+
29
+ extend T::Sig
30
+
31
+ # Shared/common fields
32
+ const :source, Source::CarrierWave, default: Source::CarrierWave
33
+ const :event, Event, default: Event::Delete
34
+ const :timestamp, Time, factory: -> { Time.now }
35
+ const :level, Level, default: Level::Info
36
+
37
+ const :storage, String
38
+ const :file_id, String
39
+ const :uploader, T.nilable(String), default: nil
40
+ const :model, T.nilable(String), default: nil
41
+ const :mount_point, T.nilable(String), default: nil
42
+
43
+ # Event-specific fields
44
+
45
+ # Additional data
46
+ include LogStruct::Log::Interfaces::AdditionalDataField
47
+ const :additional_data, T.nilable(T::Hash[T.any(String, Symbol), T.untyped]), default: nil
48
+ include LogStruct::Log::Shared::MergeAdditionalDataFields
49
+
50
+ # Request fields (optional)
51
+
52
+ # Serialize shared fields
53
+ include LogStruct::Log::Interfaces::CommonFields
54
+ include LogStruct::Log::Shared::SerializeCommon
55
+
56
+ sig {
57
+ params(storage: T.untyped,
58
+ file_id: T.untyped,
59
+ uploader: T.untyped,
60
+ model: T.untyped,
61
+ mount_point: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
62
+ }
63
+ def self.base_hash(storage: nil,
64
+ file_id: nil,
65
+ uploader: nil,
66
+ model: nil,
67
+ mount_point: nil)
68
+ h = {}
69
+ h[LogField::Storage] = storage unless storage.nil?
70
+ h[LogField::FileId] = file_id unless file_id.nil?
71
+ h[LogField::Uploader] = uploader unless uploader.nil?
72
+ h[LogField::Model] = model unless model.nil?
73
+ h[LogField::MountPoint] = mount_point unless mount_point.nil?
74
+ h
75
+ end
76
+
77
+ sig {
78
+ params(storage: T.untyped,
79
+ file_id: T.untyped,
80
+ uploader: T.untyped,
81
+ model: T.untyped,
82
+ mount_point: T.untyped,
83
+ additional_data: T.untyped,
84
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
85
+ }
86
+ def self.build(storage:,
87
+ file_id:,
88
+ uploader: nil,
89
+ model: nil,
90
+ mount_point: nil,
91
+ additional_data: nil,
92
+ timestamp: Time.now)
93
+ base_hash(storage: storage,
94
+ file_id: file_id,
95
+ uploader: uploader,
96
+ model: model,
97
+ mount_point: mount_point)
98
+ end
99
+
100
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
101
+ def to_h
102
+ self.class.build(
103
+ storage: storage,
104
+ file_id: file_id,
105
+ uploader: uploader,
106
+ model: model,
107
+ mount_point: mount_point,
108
+ additional_data: additional_data,
109
+ timestamp: timestamp
110
+ )
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,131 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
15
+ require_relative "../../enums/source"
16
+ require_relative "../../enums/event"
17
+ require_relative "../../enums/level"
18
+ require_relative "../../enums/log_field"
19
+
20
+ module LogStruct
21
+ module Log
22
+ class CarrierWave
23
+ class Download < T::Struct
24
+ # typed: strict
25
+ # frozen_string_literal: true
26
+
27
+ extend T::Sig
28
+
29
+ extend T::Sig
30
+
31
+ # Shared/common fields
32
+ const :source, Source::CarrierWave, default: Source::CarrierWave
33
+ const :event, Event, default: Event::Download
34
+ const :timestamp, Time, factory: -> { Time.now }
35
+ const :level, Level, default: Level::Info
36
+
37
+ const :storage, String
38
+ const :file_id, String
39
+ const :uploader, T.nilable(String), default: nil
40
+ const :model, T.nilable(String), default: nil
41
+ const :mount_point, T.nilable(String), default: nil
42
+
43
+ # Event-specific fields
44
+ const :filename, T.nilable(String), default: nil
45
+ const :mime_type, T.nilable(String), default: nil
46
+ const :size, T.nilable(Integer), default: nil
47
+
48
+ # Additional data
49
+ include LogStruct::Log::Interfaces::AdditionalDataField
50
+ const :additional_data, T.nilable(T::Hash[T.any(String, Symbol), T.untyped]), default: nil
51
+ include LogStruct::Log::Shared::MergeAdditionalDataFields
52
+
53
+ # Request fields (optional)
54
+
55
+ # Serialize shared fields
56
+ include LogStruct::Log::Interfaces::CommonFields
57
+ include LogStruct::Log::Shared::SerializeCommon
58
+
59
+ sig {
60
+ params(storage: T.untyped,
61
+ file_id: T.untyped,
62
+ uploader: T.untyped,
63
+ model: T.untyped,
64
+ mount_point: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
65
+ }
66
+ def self.base_hash(storage: nil,
67
+ file_id: nil,
68
+ uploader: nil,
69
+ model: nil,
70
+ mount_point: nil)
71
+ h = {}
72
+ h[LogField::Storage] = storage unless storage.nil?
73
+ h[LogField::FileId] = file_id unless file_id.nil?
74
+ h[LogField::Uploader] = uploader unless uploader.nil?
75
+ h[LogField::Model] = model unless model.nil?
76
+ h[LogField::MountPoint] = mount_point unless mount_point.nil?
77
+ h
78
+ end
79
+
80
+ sig {
81
+ params(storage: T.untyped,
82
+ file_id: T.untyped,
83
+ uploader: T.untyped,
84
+ model: T.untyped,
85
+ mount_point: T.untyped,
86
+ filename: T.untyped,
87
+ mime_type: T.untyped,
88
+ size: T.untyped,
89
+ additional_data: T.untyped,
90
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
91
+ }
92
+ def self.build(storage:,
93
+ file_id:,
94
+ uploader: nil,
95
+ model: nil,
96
+ mount_point: nil,
97
+ filename: nil,
98
+ mime_type: nil,
99
+ size: nil,
100
+ additional_data: nil,
101
+ timestamp: Time.now)
102
+ h = base_hash(storage: storage,
103
+ file_id: file_id,
104
+ uploader: uploader,
105
+ model: model,
106
+ mount_point: mount_point)
107
+ h[LogField::Filename] = filename unless filename.nil?
108
+ h[LogField::MimeType] = mime_type unless mime_type.nil?
109
+ h[LogField::Size] = size unless size.nil?
110
+ h
111
+ end
112
+
113
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
114
+ def to_h
115
+ self.class.build(
116
+ storage: storage,
117
+ file_id: file_id,
118
+ uploader: uploader,
119
+ model: model,
120
+ mount_point: mount_point,
121
+ filename: filename,
122
+ mime_type: mime_type,
123
+ size: size,
124
+ additional_data: additional_data,
125
+ timestamp: timestamp
126
+ )
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,141 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/event.rb.erb
8
+
9
+ require "log_struct/shared/interfaces/common_fields"
10
+ require "log_struct/shared/interfaces/additional_data_field"
11
+ require "log_struct/shared/interfaces/request_fields"
12
+ require "log_struct/shared/shared/serialize_common"
13
+ require "log_struct/shared/shared/merge_additional_data_fields"
14
+ require "log_struct/shared/shared/add_request_fields"
15
+ require_relative "../../enums/source"
16
+ require_relative "../../enums/event"
17
+ require_relative "../../enums/level"
18
+ require_relative "../../enums/log_field"
19
+
20
+ module LogStruct
21
+ module Log
22
+ class CarrierWave
23
+ class Upload < T::Struct
24
+ # typed: strict
25
+ # frozen_string_literal: true
26
+
27
+ extend T::Sig
28
+
29
+ extend T::Sig
30
+
31
+ # Shared/common fields
32
+ const :source, Source::CarrierWave, default: Source::CarrierWave
33
+ const :event, Event, default: Event::Upload
34
+ const :timestamp, Time, factory: -> { Time.now }
35
+ const :level, Level, default: Level::Info
36
+
37
+ const :storage, String
38
+ const :file_id, String
39
+ const :uploader, T.nilable(String), default: nil
40
+ const :model, T.nilable(String), default: nil
41
+ const :mount_point, T.nilable(String), default: nil
42
+
43
+ # Event-specific fields
44
+ const :filename, T.nilable(String), default: nil
45
+ const :mime_type, T.nilable(String), default: nil
46
+ const :size, T.nilable(Integer), default: nil
47
+ const :metadata, T.nilable(T::Hash[String, T.untyped]), default: nil
48
+ const :duration_ms, T.nilable(Float), default: nil
49
+
50
+ # Additional data
51
+ include LogStruct::Log::Interfaces::AdditionalDataField
52
+ const :additional_data, T.nilable(T::Hash[T.any(String, Symbol), T.untyped]), default: nil
53
+ include LogStruct::Log::Shared::MergeAdditionalDataFields
54
+
55
+ # Request fields (optional)
56
+
57
+ # Serialize shared fields
58
+ include LogStruct::Log::Interfaces::CommonFields
59
+ include LogStruct::Log::Shared::SerializeCommon
60
+
61
+ sig {
62
+ params(storage: T.untyped,
63
+ file_id: T.untyped,
64
+ uploader: T.untyped,
65
+ model: T.untyped,
66
+ mount_point: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
67
+ }
68
+ def self.base_hash(storage: nil,
69
+ file_id: nil,
70
+ uploader: nil,
71
+ model: nil,
72
+ mount_point: nil)
73
+ h = {}
74
+ h[LogField::Storage] = storage unless storage.nil?
75
+ h[LogField::FileId] = file_id unless file_id.nil?
76
+ h[LogField::Uploader] = uploader unless uploader.nil?
77
+ h[LogField::Model] = model unless model.nil?
78
+ h[LogField::MountPoint] = mount_point unless mount_point.nil?
79
+ h
80
+ end
81
+
82
+ sig {
83
+ params(storage: T.untyped,
84
+ file_id: T.untyped,
85
+ uploader: T.untyped,
86
+ model: T.untyped,
87
+ mount_point: T.untyped,
88
+ filename: T.untyped,
89
+ mime_type: T.untyped,
90
+ size: T.untyped,
91
+ metadata: T.untyped,
92
+ duration_ms: T.untyped,
93
+ additional_data: T.untyped,
94
+ timestamp: T.untyped).returns(T::Hash[LogStruct::LogField, T.untyped])
95
+ }
96
+ def self.build(storage:,
97
+ file_id:,
98
+ uploader: nil,
99
+ model: nil,
100
+ mount_point: nil,
101
+ filename: nil,
102
+ mime_type: nil,
103
+ size: nil,
104
+ metadata: nil,
105
+ duration_ms: nil,
106
+ additional_data: nil,
107
+ timestamp: Time.now)
108
+ h = base_hash(storage: storage,
109
+ file_id: file_id,
110
+ uploader: uploader,
111
+ model: model,
112
+ mount_point: mount_point)
113
+ h[LogField::Filename] = filename unless filename.nil?
114
+ h[LogField::MimeType] = mime_type unless mime_type.nil?
115
+ h[LogField::Size] = size unless size.nil?
116
+ h[LogField::Metadata] = metadata unless metadata.nil?
117
+ h[LogField::DurationMs] = duration_ms unless duration_ms.nil?
118
+ h
119
+ end
120
+
121
+ sig { returns(T::Hash[LogStruct::LogField, T.untyped]) }
122
+ def to_h
123
+ self.class.build(
124
+ storage: storage,
125
+ file_id: file_id,
126
+ uploader: uploader,
127
+ model: model,
128
+ mount_point: mount_point,
129
+ filename: filename,
130
+ mime_type: mime_type,
131
+ size: size,
132
+ metadata: metadata,
133
+ duration_ms: duration_ms,
134
+ additional_data: additional_data,
135
+ timestamp: timestamp
136
+ )
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -1,81 +1,46 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require_relative "interfaces/common_fields"
5
- require_relative "interfaces/additional_data_field"
6
- require_relative "shared/serialize_common"
7
- require_relative "shared/merge_additional_data_fields"
8
- require_relative "../enums/source"
9
- require_relative "../enums/event"
10
- require_relative "../enums/level"
11
- require_relative "../log_keys"
4
+ # AUTO-GENERATED: DO NOT EDIT
5
+ # Generated by scripts/generate_structs.rb
6
+ # Schemas dir: schemas/log_sources/
7
+ # Template: tools/codegen/templates/sorbet/source_parent.rb.erb
8
+
9
+ require_relative "carrierwave/upload"
10
+ require_relative "carrierwave/delete"
11
+ require_relative "carrierwave/download"
12
12
 
13
13
  module LogStruct
14
14
  module Log
15
- # CarrierWave log entry for structured logging
16
- class CarrierWave < T::Struct
17
- extend T::Sig
18
-
19
- include Interfaces::CommonFields
20
- include Interfaces::AdditionalDataField
21
- include SerializeCommon
22
- include MergeAdditionalDataFields
23
-
24
- CarrierWaveEvent = T.type_alias {
25
- T.any(
26
- Event::Upload,
27
- Event::Download,
28
- Event::Delete,
29
- Event::Metadata,
30
- Event::Exist,
31
- Event::Unknown
32
- )
33
- }
34
-
35
- # Common fields
36
- const :source, Source::CarrierWave, default: T.let(Source::CarrierWave, Source::CarrierWave)
37
- const :event, CarrierWaveEvent
38
- const :timestamp, Time, factory: -> { Time.now }
39
- const :level, Level, default: T.let(Level::Info, Level)
40
-
41
- # File-specific fields
42
- const :operation, T.nilable(Symbol), default: nil
43
- const :storage, T.nilable(String), default: nil
44
- const :file_id, T.nilable(String), default: nil
45
- const :filename, T.nilable(String), default: nil
46
- const :mime_type, T.nilable(String), default: nil
47
- const :size, T.nilable(Integer), default: nil
48
- const :metadata, T.nilable(T::Hash[String, T.untyped]), default: nil
49
- const :duration, T.nilable(Float), default: nil
50
-
51
- # CarrierWave-specific fields
52
- const :uploader, T.nilable(String), default: nil
53
- const :model, T.nilable(String), default: nil
54
- const :mount_point, T.nilable(String), default: nil
55
- const :additional_data, T::Hash[Symbol, T.untyped], default: {}
56
-
57
- # Convert the log entry to a hash for serialization
58
- sig { override.params(strict: T::Boolean).returns(T::Hash[Symbol, T.untyped]) }
59
- def serialize(strict = true)
60
- hash = serialize_common(strict)
61
- merge_additional_data_fields(hash)
62
-
63
- # Add file-specific fields if they're present
64
- hash[LOG_KEYS.fetch(:storage)] = storage if storage
65
- hash[LOG_KEYS.fetch(:operation)] = operation if operation
66
- hash[LOG_KEYS.fetch(:file_id)] = file_id if file_id
67
- hash[LOG_KEYS.fetch(:filename)] = filename if filename
68
- hash[LOG_KEYS.fetch(:mime_type)] = mime_type if mime_type
69
- hash[LOG_KEYS.fetch(:size)] = size if size
70
- hash[LOG_KEYS.fetch(:metadata)] = metadata if metadata
71
- hash[LOG_KEYS.fetch(:duration)] = duration if duration
72
-
73
- # Add CarrierWave-specific fields if they're present
74
- hash[LOG_KEYS.fetch(:uploader)] = uploader if uploader
75
- hash[LOG_KEYS.fetch(:model)] = model if model
76
- hash[LOG_KEYS.fetch(:mount_point)] = mount_point if mount_point
77
-
78
- hash
15
+ class CarrierWave
16
+ class BaseFields < T::Struct
17
+ extend T::Sig
18
+ const :storage, String
19
+ const :file_id, String
20
+ const :uploader, T.nilable(String), default: nil
21
+ const :model, T.nilable(String), default: nil
22
+ const :mount_point, T.nilable(String), default: nil
23
+
24
+ Kwargs = T.type_alias do
25
+ {
26
+ storage: String,
27
+ file_id: String,
28
+ uploader: T.nilable(String),
29
+ model: T.nilable(String),
30
+ mount_point: T.nilable(String)
31
+ }
32
+ end
33
+
34
+ sig { returns(Kwargs) }
35
+ def to_kwargs
36
+ {
37
+ storage: storage,
38
+ file_id: file_id,
39
+ uploader: uploader,
40
+ model: model,
41
+ mount_point: mount_point
42
+ }
43
+ end
79
44
  end
80
45
  end
81
46
  end