activesupport 7.0.8 → 7.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +142 -428
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/lib/active_support/actionable_error.rb +3 -1
  6. data/lib/active_support/array_inquirer.rb +3 -1
  7. data/lib/active_support/backtrace_cleaner.rb +39 -7
  8. data/lib/active_support/benchmarkable.rb +1 -0
  9. data/lib/active_support/broadcast_logger.rb +251 -0
  10. data/lib/active_support/builder.rb +1 -1
  11. data/lib/active_support/cache/coder.rb +153 -0
  12. data/lib/active_support/cache/entry.rb +134 -0
  13. data/lib/active_support/cache/file_store.rb +49 -17
  14. data/lib/active_support/cache/mem_cache_store.rb +94 -128
  15. data/lib/active_support/cache/memory_store.rb +80 -25
  16. data/lib/active_support/cache/null_store.rb +6 -0
  17. data/lib/active_support/cache/redis_cache_store.rb +165 -152
  18. data/lib/active_support/cache/serializer_with_fallback.rb +152 -0
  19. data/lib/active_support/cache/strategy/local_cache.rb +29 -14
  20. data/lib/active_support/cache.rb +363 -291
  21. data/lib/active_support/callbacks.rb +118 -134
  22. data/lib/active_support/code_generator.rb +15 -10
  23. data/lib/active_support/concern.rb +4 -2
  24. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +42 -3
  25. data/lib/active_support/concurrency/null_lock.rb +13 -0
  26. data/lib/active_support/configurable.rb +10 -0
  27. data/lib/active_support/core_ext/array/conversions.rb +1 -2
  28. data/lib/active_support/core_ext/array.rb +0 -1
  29. data/lib/active_support/core_ext/class/subclasses.rb +17 -34
  30. data/lib/active_support/core_ext/date/blank.rb +4 -0
  31. data/lib/active_support/core_ext/date/conversions.rb +1 -2
  32. data/lib/active_support/core_ext/date.rb +0 -1
  33. data/lib/active_support/core_ext/date_and_time/calculations.rb +10 -0
  34. data/lib/active_support/core_ext/date_and_time/compatibility.rb +28 -1
  35. data/lib/active_support/core_ext/date_time/blank.rb +4 -0
  36. data/lib/active_support/core_ext/date_time/conversions.rb +2 -2
  37. data/lib/active_support/core_ext/date_time.rb +0 -1
  38. data/lib/active_support/core_ext/digest/uuid.rb +7 -10
  39. data/lib/active_support/core_ext/enumerable.rb +3 -75
  40. data/lib/active_support/core_ext/erb/util.rb +201 -0
  41. data/lib/active_support/core_ext/hash/conversions.rb +1 -1
  42. data/lib/active_support/core_ext/hash/deep_merge.rb +22 -14
  43. data/lib/active_support/core_ext/hash/keys.rb +4 -4
  44. data/lib/active_support/core_ext/module/attr_internal.rb +17 -6
  45. data/lib/active_support/core_ext/module/attribute_accessors.rb +6 -0
  46. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +34 -16
  47. data/lib/active_support/core_ext/module/concerning.rb +6 -6
  48. data/lib/active_support/core_ext/module/delegation.rb +20 -119
  49. data/lib/active_support/core_ext/module/deprecation.rb +12 -12
  50. data/lib/active_support/core_ext/module/introspection.rb +0 -1
  51. data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
  52. data/lib/active_support/core_ext/numeric/conversions.rb +5 -3
  53. data/lib/active_support/core_ext/numeric.rb +0 -1
  54. data/lib/active_support/core_ext/object/blank.rb +45 -1
  55. data/lib/active_support/core_ext/object/deep_dup.rb +16 -0
  56. data/lib/active_support/core_ext/object/duplicable.rb +24 -15
  57. data/lib/active_support/core_ext/object/inclusion.rb +13 -5
  58. data/lib/active_support/core_ext/object/instance_variables.rb +4 -2
  59. data/lib/active_support/core_ext/object/json.rb +17 -7
  60. data/lib/active_support/core_ext/object/with.rb +46 -0
  61. data/lib/active_support/core_ext/object/with_options.rb +4 -4
  62. data/lib/active_support/core_ext/object.rb +1 -0
  63. data/lib/active_support/core_ext/pathname/blank.rb +20 -0
  64. data/lib/active_support/core_ext/pathname/existence.rb +2 -0
  65. data/lib/active_support/core_ext/pathname.rb +1 -0
  66. data/lib/active_support/core_ext/range/conversions.rb +28 -7
  67. data/lib/active_support/core_ext/range/overlap.rb +40 -0
  68. data/lib/active_support/core_ext/range.rb +1 -2
  69. data/lib/active_support/core_ext/securerandom.rb +1 -5
  70. data/lib/active_support/core_ext/string/conversions.rb +1 -1
  71. data/lib/active_support/core_ext/string/filters.rb +21 -15
  72. data/lib/active_support/core_ext/string/indent.rb +1 -1
  73. data/lib/active_support/core_ext/string/inflections.rb +16 -5
  74. data/lib/active_support/core_ext/string/multibyte.rb +1 -1
  75. data/lib/active_support/core_ext/string/output_safety.rb +34 -177
  76. data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
  77. data/lib/active_support/core_ext/time/calculations.rb +36 -30
  78. data/lib/active_support/core_ext/time/compatibility.rb +16 -0
  79. data/lib/active_support/core_ext/time/conversions.rb +1 -3
  80. data/lib/active_support/core_ext/time/zones.rb +4 -4
  81. data/lib/active_support/core_ext/time.rb +0 -1
  82. data/lib/active_support/core_ext.rb +0 -1
  83. data/lib/active_support/current_attributes.rb +53 -46
  84. data/lib/active_support/deep_mergeable.rb +53 -0
  85. data/lib/active_support/delegation.rb +202 -0
  86. data/lib/active_support/dependencies/autoload.rb +9 -16
  87. data/lib/active_support/deprecation/behaviors.rb +65 -42
  88. data/lib/active_support/deprecation/constant_accessor.rb +47 -25
  89. data/lib/active_support/deprecation/deprecators.rb +104 -0
  90. data/lib/active_support/deprecation/disallowed.rb +3 -5
  91. data/lib/active_support/deprecation/method_wrappers.rb +6 -23
  92. data/lib/active_support/deprecation/proxy_wrappers.rb +34 -22
  93. data/lib/active_support/deprecation/reporting.rb +49 -27
  94. data/lib/active_support/deprecation.rb +39 -9
  95. data/lib/active_support/deprecator.rb +7 -0
  96. data/lib/active_support/descendants_tracker.rb +66 -172
  97. data/lib/active_support/duration/iso8601_parser.rb +2 -2
  98. data/lib/active_support/duration/iso8601_serializer.rb +1 -4
  99. data/lib/active_support/duration.rb +13 -7
  100. data/lib/active_support/encrypted_configuration.rb +30 -9
  101. data/lib/active_support/encrypted_file.rb +9 -4
  102. data/lib/active_support/environment_inquirer.rb +22 -2
  103. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  104. data/lib/active_support/error_reporter.rb +160 -36
  105. data/lib/active_support/evented_file_update_checker.rb +0 -1
  106. data/lib/active_support/execution_wrapper.rb +4 -5
  107. data/lib/active_support/file_update_checker.rb +5 -3
  108. data/lib/active_support/fork_tracker.rb +4 -32
  109. data/lib/active_support/gem_version.rb +3 -3
  110. data/lib/active_support/gzip.rb +2 -0
  111. data/lib/active_support/hash_with_indifferent_access.rb +41 -25
  112. data/lib/active_support/html_safe_translation.rb +19 -6
  113. data/lib/active_support/i18n.rb +1 -1
  114. data/lib/active_support/i18n_railtie.rb +20 -13
  115. data/lib/active_support/inflector/inflections.rb +2 -0
  116. data/lib/active_support/inflector/methods.rb +23 -11
  117. data/lib/active_support/inflector/transliterate.rb +3 -1
  118. data/lib/active_support/isolated_execution_state.rb +26 -22
  119. data/lib/active_support/json/decoding.rb +2 -1
  120. data/lib/active_support/json/encoding.rb +25 -43
  121. data/lib/active_support/key_generator.rb +9 -1
  122. data/lib/active_support/lazy_load_hooks.rb +6 -4
  123. data/lib/active_support/locale/en.yml +2 -0
  124. data/lib/active_support/log_subscriber.rb +74 -34
  125. data/lib/active_support/logger.rb +22 -60
  126. data/lib/active_support/logger_thread_safe_level.rb +10 -32
  127. data/lib/active_support/message_encryptor.rb +197 -53
  128. data/lib/active_support/message_encryptors.rb +141 -0
  129. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  130. data/lib/active_support/message_pack/extensions.rb +305 -0
  131. data/lib/active_support/message_pack/serializer.rb +63 -0
  132. data/lib/active_support/message_pack.rb +50 -0
  133. data/lib/active_support/message_verifier.rb +220 -89
  134. data/lib/active_support/message_verifiers.rb +135 -0
  135. data/lib/active_support/messages/codec.rb +65 -0
  136. data/lib/active_support/messages/metadata.rb +111 -45
  137. data/lib/active_support/messages/rotation_coordinator.rb +93 -0
  138. data/lib/active_support/messages/rotator.rb +34 -32
  139. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  140. data/lib/active_support/multibyte/chars.rb +4 -2
  141. data/lib/active_support/multibyte/unicode.rb +9 -37
  142. data/lib/active_support/notifications/fanout.rb +248 -87
  143. data/lib/active_support/notifications/instrumenter.rb +93 -25
  144. data/lib/active_support/notifications.rb +29 -28
  145. data/lib/active_support/number_helper/number_converter.rb +16 -7
  146. data/lib/active_support/number_helper/number_to_currency_converter.rb +6 -6
  147. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -3
  148. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -0
  149. data/lib/active_support/number_helper.rb +379 -318
  150. data/lib/active_support/option_merger.rb +2 -2
  151. data/lib/active_support/ordered_hash.rb +3 -3
  152. data/lib/active_support/ordered_options.rb +67 -15
  153. data/lib/active_support/parameter_filter.rb +84 -69
  154. data/lib/active_support/proxy_object.rb +8 -3
  155. data/lib/active_support/railtie.rb +25 -20
  156. data/lib/active_support/reloader.rb +12 -4
  157. data/lib/active_support/rescuable.rb +2 -0
  158. data/lib/active_support/secure_compare_rotator.rb +16 -9
  159. data/lib/active_support/string_inquirer.rb +4 -2
  160. data/lib/active_support/subscriber.rb +10 -27
  161. data/lib/active_support/syntax_error_proxy.rb +60 -0
  162. data/lib/active_support/tagged_logging.rb +64 -25
  163. data/lib/active_support/test_case.rb +156 -7
  164. data/lib/active_support/testing/assertions.rb +28 -12
  165. data/lib/active_support/testing/autorun.rb +0 -2
  166. data/lib/active_support/testing/constant_stubbing.rb +54 -0
  167. data/lib/active_support/testing/deprecation.rb +20 -27
  168. data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
  169. data/lib/active_support/testing/isolation.rb +21 -9
  170. data/lib/active_support/testing/method_call_assertions.rb +7 -8
  171. data/lib/active_support/testing/parallelization/server.rb +3 -0
  172. data/lib/active_support/testing/parallelize_executor.rb +8 -3
  173. data/lib/active_support/testing/setup_and_teardown.rb +2 -0
  174. data/lib/active_support/testing/stream.rb +1 -1
  175. data/lib/active_support/testing/strict_warnings.rb +43 -0
  176. data/lib/active_support/testing/tests_without_assertions.rb +19 -0
  177. data/lib/active_support/testing/time_helpers.rb +38 -16
  178. data/lib/active_support/time_with_zone.rb +12 -18
  179. data/lib/active_support/values/time_zone.rb +25 -14
  180. data/lib/active_support/version.rb +1 -1
  181. data/lib/active_support/xml_mini/jdom.rb +3 -10
  182. data/lib/active_support/xml_mini/nokogiri.rb +1 -1
  183. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  184. data/lib/active_support/xml_mini/rexml.rb +1 -1
  185. data/lib/active_support/xml_mini.rb +12 -3
  186. data/lib/active_support.rb +15 -3
  187. metadata +145 -24
  188. data/lib/active_support/core_ext/array/deprecated_conversions.rb +0 -25
  189. data/lib/active_support/core_ext/date/deprecated_conversions.rb +0 -40
  190. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +0 -36
  191. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +0 -60
  192. data/lib/active_support/core_ext/range/deprecated_conversions.rb +0 -36
  193. data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -5
  194. data/lib/active_support/core_ext/range/overlaps.rb +0 -10
  195. data/lib/active_support/core_ext/time/deprecated_conversions.rb +0 -73
  196. data/lib/active_support/core_ext/uri.rb +0 -5
  197. data/lib/active_support/deprecation/instance_delegator.rb +0 -38
  198. data/lib/active_support/per_thread_registry.rb +0 -65
  199. data/lib/active_support/ruby_features.rb +0 -7
@@ -0,0 +1,305 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bigdecimal"
4
+ require "date"
5
+ require "ipaddr"
6
+ require "pathname"
7
+ require "uri/generic"
8
+ require "msgpack/bigint"
9
+ require "active_support/hash_with_indifferent_access"
10
+ require "active_support/time"
11
+
12
+ module ActiveSupport
13
+ module MessagePack
14
+ class UnserializableObjectError < StandardError; end
15
+ class MissingClassError < StandardError; end # :nodoc:
16
+
17
+ module Extensions # :nodoc:
18
+ extend self
19
+
20
+ def install(registry)
21
+ registry.register_type 0, Symbol,
22
+ packer: :to_msgpack_ext,
23
+ unpacker: :from_msgpack_ext,
24
+ optimized_symbols_parsing: true
25
+
26
+ registry.register_type 1, Integer,
27
+ packer: ::MessagePack::Bigint.method(:to_msgpack_ext),
28
+ unpacker: ::MessagePack::Bigint.method(:from_msgpack_ext),
29
+ oversized_integer_extension: true
30
+
31
+ registry.register_type 2, BigDecimal,
32
+ packer: :_dump,
33
+ unpacker: :_load
34
+
35
+ registry.register_type 3, Rational,
36
+ packer: method(:write_rational),
37
+ unpacker: method(:read_rational),
38
+ recursive: true
39
+
40
+ registry.register_type 4, Complex,
41
+ packer: method(:write_complex),
42
+ unpacker: method(:read_complex),
43
+ recursive: true
44
+
45
+ registry.register_type 5, DateTime,
46
+ packer: method(:write_datetime),
47
+ unpacker: method(:read_datetime),
48
+ recursive: true
49
+
50
+ registry.register_type 6, Date,
51
+ packer: method(:write_date),
52
+ unpacker: method(:read_date),
53
+ recursive: true
54
+
55
+ registry.register_type 7, Time,
56
+ packer: method(:write_time),
57
+ unpacker: method(:read_time),
58
+ recursive: true
59
+
60
+ registry.register_type 8, ActiveSupport::TimeWithZone,
61
+ packer: method(:write_time_with_zone),
62
+ unpacker: method(:read_time_with_zone),
63
+ recursive: true
64
+
65
+ registry.register_type 9, ActiveSupport::TimeZone,
66
+ packer: method(:dump_time_zone),
67
+ unpacker: method(:load_time_zone)
68
+
69
+ registry.register_type 10, ActiveSupport::Duration,
70
+ packer: method(:write_duration),
71
+ unpacker: method(:read_duration),
72
+ recursive: true
73
+
74
+ registry.register_type 11, Range,
75
+ packer: method(:write_range),
76
+ unpacker: method(:read_range),
77
+ recursive: true
78
+
79
+ registry.register_type 12, Set,
80
+ packer: method(:write_set),
81
+ unpacker: method(:read_set),
82
+ recursive: true
83
+
84
+ registry.register_type 13, URI::Generic,
85
+ packer: :to_s,
86
+ unpacker: URI.method(:parse)
87
+
88
+ registry.register_type 14, IPAddr,
89
+ packer: method(:write_ipaddr),
90
+ unpacker: method(:read_ipaddr),
91
+ recursive: true
92
+
93
+ registry.register_type 15, Pathname,
94
+ packer: :to_s,
95
+ unpacker: :new
96
+
97
+ registry.register_type 16, Regexp,
98
+ packer: :to_s,
99
+ unpacker: :new
100
+
101
+ registry.register_type 17, ActiveSupport::HashWithIndifferentAccess,
102
+ packer: method(:write_hash_with_indifferent_access),
103
+ unpacker: method(:read_hash_with_indifferent_access),
104
+ recursive: true
105
+ end
106
+
107
+ def install_unregistered_type_error(registry)
108
+ registry.register_type 127, Object,
109
+ packer: method(:raise_unserializable),
110
+ unpacker: method(:raise_invalid_format)
111
+ end
112
+
113
+ def install_unregistered_type_fallback(registry)
114
+ registry.register_type 127, Object,
115
+ packer: method(:write_object),
116
+ unpacker: method(:read_object),
117
+ recursive: true
118
+ end
119
+
120
+ def write_rational(rational, packer)
121
+ packer.write(rational.numerator)
122
+ packer.write(rational.denominator) unless rational.numerator.zero?
123
+ end
124
+
125
+ def read_rational(unpacker)
126
+ numerator = unpacker.read
127
+ Rational(numerator, numerator.zero? ? 1 : unpacker.read)
128
+ end
129
+
130
+ def write_complex(complex, packer)
131
+ packer.write(complex.real)
132
+ packer.write(complex.imaginary)
133
+ end
134
+
135
+ def read_complex(unpacker)
136
+ Complex(unpacker.read, unpacker.read)
137
+ end
138
+
139
+ def write_datetime(datetime, packer)
140
+ packer.write(datetime.jd)
141
+ packer.write(datetime.hour)
142
+ packer.write(datetime.min)
143
+ packer.write(datetime.sec)
144
+ write_rational(datetime.sec_fraction, packer)
145
+ write_rational(datetime.offset, packer)
146
+ end
147
+
148
+ def read_datetime(unpacker)
149
+ DateTime.jd(unpacker.read, unpacker.read, unpacker.read, unpacker.read + read_rational(unpacker), read_rational(unpacker))
150
+ end
151
+
152
+ def write_date(date, packer)
153
+ packer.write(date.jd)
154
+ end
155
+
156
+ def read_date(unpacker)
157
+ Date.jd(unpacker.read)
158
+ end
159
+
160
+ def write_time(time, packer)
161
+ packer.write(time.tv_sec)
162
+ packer.write(time.tv_nsec)
163
+ packer.write(time.utc_offset)
164
+ end
165
+
166
+ def read_time(unpacker)
167
+ Time.at_without_coercion(unpacker.read, unpacker.read, :nanosecond, in: unpacker.read)
168
+ end
169
+
170
+ def write_time_with_zone(twz, packer)
171
+ write_time(twz.utc, packer)
172
+ write_time_zone(twz.time_zone, packer)
173
+ end
174
+
175
+ def read_time_with_zone(unpacker)
176
+ ActiveSupport::TimeWithZone.new(read_time(unpacker), read_time_zone(unpacker))
177
+ end
178
+
179
+ def dump_time_zone(time_zone)
180
+ time_zone.name
181
+ end
182
+
183
+ def load_time_zone(name)
184
+ ActiveSupport::TimeZone[name]
185
+ end
186
+
187
+ def write_time_zone(time_zone, packer)
188
+ packer.write(dump_time_zone(time_zone))
189
+ end
190
+
191
+ def read_time_zone(unpacker)
192
+ load_time_zone(unpacker.read)
193
+ end
194
+
195
+ def write_duration(duration, packer)
196
+ packer.write(duration.value)
197
+ packer.write(duration._parts.values_at(*ActiveSupport::Duration::PARTS))
198
+ end
199
+
200
+ def read_duration(unpacker)
201
+ value = unpacker.read
202
+ parts = ActiveSupport::Duration::PARTS.zip(unpacker.read).to_h
203
+ parts.compact!
204
+ ActiveSupport::Duration.new(value, parts)
205
+ end
206
+
207
+ def write_range(range, packer)
208
+ packer.write(range.begin)
209
+ packer.write(range.end)
210
+ packer.write(range.exclude_end?)
211
+ end
212
+
213
+ def read_range(unpacker)
214
+ Range.new(unpacker.read, unpacker.read, unpacker.read)
215
+ end
216
+
217
+ def write_set(set, packer)
218
+ packer.write(set.to_a)
219
+ end
220
+
221
+ def read_set(unpacker)
222
+ Set.new(unpacker.read)
223
+ end
224
+
225
+ def write_ipaddr(ipaddr, packer)
226
+ if ipaddr.prefix < 32 || (ipaddr.ipv6? && ipaddr.prefix < 128)
227
+ packer.write("#{ipaddr}/#{ipaddr.prefix}")
228
+ else
229
+ packer.write(ipaddr.to_s)
230
+ end
231
+ end
232
+
233
+ def read_ipaddr(unpacker)
234
+ IPAddr.new(unpacker.read)
235
+ end
236
+
237
+ def write_hash_with_indifferent_access(hwia, packer)
238
+ packer.write(hwia.to_h)
239
+ end
240
+
241
+ def read_hash_with_indifferent_access(unpacker)
242
+ ActiveSupport::HashWithIndifferentAccess.new(unpacker.read)
243
+ end
244
+
245
+ def raise_unserializable(object, *)
246
+ raise UnserializableObjectError, "Unsupported type #{object.class} for object #{object.inspect}"
247
+ end
248
+
249
+ def raise_invalid_format(*)
250
+ raise "Invalid format"
251
+ end
252
+
253
+ def dump_class(klass)
254
+ raise UnserializableObjectError, "Cannot serialize anonymous class" unless klass.name
255
+ klass.name
256
+ end
257
+
258
+ def load_class(name)
259
+ Object.const_get(name)
260
+ rescue NameError => error
261
+ if error.name.to_s == name
262
+ raise MissingClassError, "Missing class: #{name}"
263
+ else
264
+ raise
265
+ end
266
+ end
267
+
268
+ def write_class(klass, packer)
269
+ packer.write(dump_class(klass))
270
+ end
271
+
272
+ def read_class(unpacker)
273
+ load_class(unpacker.read)
274
+ end
275
+
276
+ LOAD_WITH_MSGPACK_EXT = 0
277
+ LOAD_WITH_JSON_CREATE = 1
278
+
279
+ def write_object(object, packer)
280
+ if object.class.respond_to?(:from_msgpack_ext)
281
+ packer.write(LOAD_WITH_MSGPACK_EXT)
282
+ write_class(object.class, packer)
283
+ packer.write(object.to_msgpack_ext)
284
+ elsif object.class.respond_to?(:json_create)
285
+ packer.write(LOAD_WITH_JSON_CREATE)
286
+ write_class(object.class, packer)
287
+ packer.write(object.as_json)
288
+ else
289
+ raise_unserializable(object)
290
+ end
291
+ end
292
+
293
+ def read_object(unpacker)
294
+ case unpacker.read
295
+ when LOAD_WITH_MSGPACK_EXT
296
+ read_class(unpacker).from_msgpack_ext(unpacker.read)
297
+ when LOAD_WITH_JSON_CREATE
298
+ read_class(unpacker).json_create(unpacker.read)
299
+ else
300
+ raise_invalid_format
301
+ end
302
+ end
303
+ end
304
+ end
305
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "extensions"
4
+
5
+ module ActiveSupport
6
+ module MessagePack
7
+ module Serializer # :nodoc:
8
+ SIGNATURE = "\xCC\x80".b.freeze # == 128.to_msgpack
9
+ SIGNATURE_INT = 128
10
+
11
+ def dump(object)
12
+ message_pack_pool.packer do |packer|
13
+ packer.write(SIGNATURE_INT)
14
+ packer.write(object)
15
+ packer.full_pack
16
+ end
17
+ end
18
+
19
+ def load(dumped)
20
+ message_pack_pool.unpacker do |unpacker|
21
+ unpacker.feed_reference(dumped)
22
+ raise "Invalid serialization format" unless unpacker.read == SIGNATURE_INT
23
+ unpacker.full_unpack
24
+ end
25
+ end
26
+
27
+ def signature?(dumped)
28
+ dumped.getbyte(0) == SIGNATURE.getbyte(0) && dumped.getbyte(1) == SIGNATURE.getbyte(1)
29
+ end
30
+
31
+ def message_pack_factory
32
+ @message_pack_factory ||= ::MessagePack::Factory.new
33
+ end
34
+
35
+ def message_pack_factory=(factory)
36
+ @message_pack_pool = nil
37
+ @message_pack_factory = factory
38
+ end
39
+
40
+ delegate :register_type, to: :message_pack_factory
41
+
42
+ def warmup
43
+ message_pack_pool # eagerly compute
44
+ end
45
+
46
+ private
47
+ def message_pack_pool
48
+ @message_pack_pool ||= begin
49
+ unless message_pack_factory.frozen?
50
+ Extensions.install(message_pack_factory)
51
+ install_unregistered_type_handler
52
+ message_pack_factory.freeze
53
+ end
54
+ message_pack_factory.pool(ENV.fetch("RAILS_MAX_THREADS", 5).to_i)
55
+ end
56
+ end
57
+
58
+ def install_unregistered_type_handler
59
+ Extensions.install_unregistered_type_error(message_pack_factory)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ gem "msgpack", ">= 1.7.0"
5
+ require "msgpack"
6
+ rescue LoadError => error
7
+ warn "ActiveSupport::MessagePack requires the msgpack gem, version 1.7.0 or later. " \
8
+ "Please add it to your Gemfile: `gem \"msgpack\", \">= 1.7.0\"`"
9
+ raise error
10
+ end
11
+
12
+ require_relative "message_pack/cache_serializer"
13
+ require_relative "message_pack/serializer"
14
+
15
+ module ActiveSupport
16
+ module MessagePack
17
+ extend Serializer
18
+
19
+ ##
20
+ # :singleton-method: dump
21
+ # :call-seq: dump(object)
22
+ #
23
+ # Dumps an object. Raises ActiveSupport::MessagePack::UnserializableObjectError
24
+ # if the object type is not supported.
25
+ #
26
+ #--
27
+ # Implemented by Serializer#dump.
28
+
29
+ ##
30
+ # :singleton-method: load
31
+ # :call-seq: load(dumped)
32
+ #
33
+ # Loads an object dump created by ::dump.
34
+ #
35
+ #--
36
+ # Implemented by Serializer#load.
37
+
38
+ ##
39
+ # :singleton-method: signature?
40
+ # :call-seq: signature?(dumped)
41
+ #
42
+ # Returns true if the given dump begins with an +ActiveSupport::MessagePack+
43
+ # signature.
44
+ #
45
+ #--
46
+ # Implemented by Serializer#signature?.
47
+
48
+ ActiveSupport.run_load_hooks(:message_pack, self)
49
+ end
50
+ end