activesupport 6.0.6.1 → 7.1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +865 -438
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +6 -6
  5. data/lib/active_support/actionable_error.rb +4 -2
  6. data/lib/active_support/array_inquirer.rb +4 -2
  7. data/lib/active_support/backtrace_cleaner.rb +30 -10
  8. data/lib/active_support/benchmarkable.rb +4 -3
  9. data/lib/active_support/broadcast_logger.rb +250 -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 +53 -20
  14. data/lib/active_support/cache/mem_cache_store.rb +208 -63
  15. data/lib/active_support/cache/memory_store.rb +120 -38
  16. data/lib/active_support/cache/null_store.rb +16 -2
  17. data/lib/active_support/cache/redis_cache_store.rb +201 -208
  18. data/lib/active_support/cache/serializer_with_fallback.rb +175 -0
  19. data/lib/active_support/cache/strategy/local_cache.rb +73 -66
  20. data/lib/active_support/cache.rb +539 -261
  21. data/lib/active_support/callbacks.rb +273 -142
  22. data/lib/active_support/code_generator.rb +65 -0
  23. data/lib/active_support/concern.rb +53 -7
  24. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +44 -7
  25. data/lib/active_support/concurrency/null_lock.rb +13 -0
  26. data/lib/active_support/concurrency/share_lock.rb +2 -2
  27. data/lib/active_support/configurable.rb +19 -6
  28. data/lib/active_support/configuration_file.rb +51 -0
  29. data/lib/active_support/core_ext/array/access.rb +1 -5
  30. data/lib/active_support/core_ext/array/conversions.rb +15 -13
  31. data/lib/active_support/core_ext/array/grouping.rb +6 -6
  32. data/lib/active_support/core_ext/array/inquiry.rb +2 -2
  33. data/lib/active_support/core_ext/benchmark.rb +2 -2
  34. data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
  35. data/lib/active_support/core_ext/class/attribute.rb +34 -44
  36. data/lib/active_support/core_ext/class/subclasses.rb +19 -29
  37. data/lib/active_support/core_ext/date/blank.rb +1 -1
  38. data/lib/active_support/core_ext/date/calculations.rb +24 -9
  39. data/lib/active_support/core_ext/date/conversions.rb +18 -16
  40. data/lib/active_support/core_ext/date_and_time/calculations.rb +27 -4
  41. data/lib/active_support/core_ext/date_and_time/compatibility.rb +15 -0
  42. data/lib/active_support/core_ext/date_time/blank.rb +1 -1
  43. data/lib/active_support/core_ext/date_time/calculations.rb +4 -0
  44. data/lib/active_support/core_ext/date_time/conversions.rb +19 -15
  45. data/lib/active_support/core_ext/digest/uuid.rb +30 -13
  46. data/lib/active_support/core_ext/enumerable.rb +146 -72
  47. data/lib/active_support/core_ext/erb/util.rb +196 -0
  48. data/lib/active_support/core_ext/file/atomic.rb +3 -1
  49. data/lib/active_support/core_ext/hash/conversions.rb +3 -4
  50. data/lib/active_support/core_ext/hash/deep_merge.rb +22 -14
  51. data/lib/active_support/core_ext/hash/deep_transform_values.rb +4 -4
  52. data/lib/active_support/core_ext/hash/indifferent_access.rb +3 -3
  53. data/lib/active_support/core_ext/hash/keys.rb +5 -5
  54. data/lib/active_support/core_ext/hash/slice.rb +3 -2
  55. data/lib/active_support/core_ext/integer/inflections.rb +12 -12
  56. data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
  57. data/lib/active_support/core_ext/kernel/singleton_class.rb +1 -1
  58. data/lib/active_support/core_ext/load_error.rb +1 -1
  59. data/lib/active_support/core_ext/module/attr_internal.rb +2 -2
  60. data/lib/active_support/core_ext/module/attribute_accessors.rb +31 -29
  61. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +51 -20
  62. data/lib/active_support/core_ext/module/concerning.rb +14 -8
  63. data/lib/active_support/core_ext/module/delegation.rb +75 -42
  64. data/lib/active_support/core_ext/module/deprecation.rb +15 -12
  65. data/lib/active_support/core_ext/module/introspection.rb +1 -26
  66. data/lib/active_support/core_ext/name_error.rb +23 -2
  67. data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
  68. data/lib/active_support/core_ext/numeric/conversions.rb +82 -73
  69. data/lib/active_support/core_ext/object/acts_like.rb +29 -5
  70. data/lib/active_support/core_ext/object/blank.rb +2 -2
  71. data/lib/active_support/core_ext/object/deep_dup.rb +17 -1
  72. data/lib/active_support/core_ext/object/duplicable.rb +15 -4
  73. data/lib/active_support/core_ext/object/inclusion.rb +13 -5
  74. data/lib/active_support/core_ext/object/instance_variables.rb +22 -12
  75. data/lib/active_support/core_ext/object/json.rb +52 -28
  76. data/lib/active_support/core_ext/object/to_query.rb +2 -4
  77. data/lib/active_support/core_ext/object/try.rb +20 -20
  78. data/lib/active_support/core_ext/object/with.rb +44 -0
  79. data/lib/active_support/core_ext/object/with_options.rb +25 -6
  80. data/lib/active_support/core_ext/object.rb +1 -0
  81. data/lib/active_support/core_ext/pathname/blank.rb +16 -0
  82. data/lib/active_support/core_ext/pathname/existence.rb +23 -0
  83. data/lib/active_support/core_ext/pathname.rb +4 -0
  84. data/lib/active_support/core_ext/range/compare_range.rb +6 -25
  85. data/lib/active_support/core_ext/range/conversions.rb +34 -13
  86. data/lib/active_support/core_ext/range/each.rb +1 -1
  87. data/lib/active_support/core_ext/range/overlap.rb +40 -0
  88. data/lib/active_support/core_ext/range.rb +1 -2
  89. data/lib/active_support/core_ext/regexp.rb +8 -1
  90. data/lib/active_support/core_ext/securerandom.rb +25 -13
  91. data/lib/active_support/core_ext/string/access.rb +5 -24
  92. data/lib/active_support/core_ext/string/conversions.rb +3 -2
  93. data/lib/active_support/core_ext/string/filters.rb +21 -15
  94. data/lib/active_support/core_ext/string/indent.rb +1 -1
  95. data/lib/active_support/core_ext/string/inflections.rb +51 -10
  96. data/lib/active_support/core_ext/string/inquiry.rb +2 -1
  97. data/lib/active_support/core_ext/string/multibyte.rb +2 -2
  98. data/lib/active_support/core_ext/string/output_safety.rb +85 -194
  99. data/lib/active_support/core_ext/string/starts_ends_with.rb +2 -2
  100. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +6 -0
  101. data/lib/active_support/core_ext/symbol.rb +3 -0
  102. data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
  103. data/lib/active_support/core_ext/time/calculations.rb +46 -8
  104. data/lib/active_support/core_ext/time/conversions.rb +16 -13
  105. data/lib/active_support/core_ext/time/zones.rb +12 -28
  106. data/lib/active_support/core_ext.rb +2 -1
  107. data/lib/active_support/current_attributes/test_helper.rb +13 -0
  108. data/lib/active_support/current_attributes.rb +54 -22
  109. data/lib/active_support/deep_mergeable.rb +53 -0
  110. data/lib/active_support/dependencies/autoload.rb +17 -12
  111. data/lib/active_support/dependencies/interlock.rb +10 -18
  112. data/lib/active_support/dependencies/require_dependency.rb +28 -0
  113. data/lib/active_support/dependencies.rb +58 -769
  114. data/lib/active_support/deprecation/behaviors.rb +77 -38
  115. data/lib/active_support/deprecation/constant_accessor.rb +5 -4
  116. data/lib/active_support/deprecation/deprecators.rb +104 -0
  117. data/lib/active_support/deprecation/disallowed.rb +54 -0
  118. data/lib/active_support/deprecation/instance_delegator.rb +31 -5
  119. data/lib/active_support/deprecation/method_wrappers.rb +12 -28
  120. data/lib/active_support/deprecation/proxy_wrappers.rb +40 -25
  121. data/lib/active_support/deprecation/reporting.rb +76 -16
  122. data/lib/active_support/deprecation.rb +36 -4
  123. data/lib/active_support/deprecator.rb +7 -0
  124. data/lib/active_support/descendants_tracker.rb +150 -68
  125. data/lib/active_support/digest.rb +5 -3
  126. data/lib/active_support/duration/iso8601_parser.rb +3 -3
  127. data/lib/active_support/duration/iso8601_serializer.rb +24 -12
  128. data/lib/active_support/duration.rb +136 -56
  129. data/lib/active_support/encrypted_configuration.rb +72 -9
  130. data/lib/active_support/encrypted_file.rb +46 -13
  131. data/lib/active_support/environment_inquirer.rb +40 -0
  132. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  133. data/lib/active_support/error_reporter.rb +203 -0
  134. data/lib/active_support/evented_file_update_checker.rb +86 -137
  135. data/lib/active_support/execution_context/test_helper.rb +13 -0
  136. data/lib/active_support/execution_context.rb +53 -0
  137. data/lib/active_support/execution_wrapper.rb +31 -12
  138. data/lib/active_support/executor/test_helper.rb +7 -0
  139. data/lib/active_support/file_update_checker.rb +4 -2
  140. data/lib/active_support/fork_tracker.rb +79 -0
  141. data/lib/active_support/gem_version.rb +5 -5
  142. data/lib/active_support/gzip.rb +2 -0
  143. data/lib/active_support/hash_with_indifferent_access.rb +86 -42
  144. data/lib/active_support/html_safe_translation.rb +53 -0
  145. data/lib/active_support/i18n.rb +2 -1
  146. data/lib/active_support/i18n_railtie.rb +29 -27
  147. data/lib/active_support/inflector/inflections.rb +26 -9
  148. data/lib/active_support/inflector/methods.rb +54 -64
  149. data/lib/active_support/inflector/transliterate.rb +7 -5
  150. data/lib/active_support/isolated_execution_state.rb +76 -0
  151. data/lib/active_support/json/decoding.rb +6 -5
  152. data/lib/active_support/json/encoding.rb +31 -45
  153. data/lib/active_support/key_generator.rb +32 -7
  154. data/lib/active_support/lazy_load_hooks.rb +33 -7
  155. data/lib/active_support/locale/en.yml +10 -4
  156. data/lib/active_support/log_subscriber/test_helper.rb +2 -2
  157. data/lib/active_support/log_subscriber.rb +101 -32
  158. data/lib/active_support/logger.rb +9 -60
  159. data/lib/active_support/logger_silence.rb +2 -26
  160. data/lib/active_support/logger_thread_safe_level.rb +24 -25
  161. data/lib/active_support/message_encryptor.rb +205 -58
  162. data/lib/active_support/message_encryptors.rb +141 -0
  163. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  164. data/lib/active_support/message_pack/extensions.rb +292 -0
  165. data/lib/active_support/message_pack/serializer.rb +63 -0
  166. data/lib/active_support/message_pack.rb +50 -0
  167. data/lib/active_support/message_verifier.rb +237 -86
  168. data/lib/active_support/message_verifiers.rb +135 -0
  169. data/lib/active_support/messages/codec.rb +65 -0
  170. data/lib/active_support/messages/metadata.rb +112 -46
  171. data/lib/active_support/messages/rotation_configuration.rb +2 -1
  172. data/lib/active_support/messages/rotation_coordinator.rb +93 -0
  173. data/lib/active_support/messages/rotator.rb +35 -32
  174. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  175. data/lib/active_support/multibyte/chars.rb +15 -52
  176. data/lib/active_support/multibyte/unicode.rb +8 -122
  177. data/lib/active_support/multibyte.rb +1 -1
  178. data/lib/active_support/notifications/fanout.rb +310 -105
  179. data/lib/active_support/notifications/instrumenter.rb +113 -48
  180. data/lib/active_support/notifications.rb +56 -29
  181. data/lib/active_support/number_helper/number_converter.rb +15 -8
  182. data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
  183. data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
  184. data/lib/active_support/number_helper/number_to_human_converter.rb +1 -1
  185. data/lib/active_support/number_helper/number_to_human_size_converter.rb +5 -5
  186. data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -1
  187. data/lib/active_support/number_helper/number_to_rounded_converter.rb +9 -5
  188. data/lib/active_support/number_helper/rounding_helper.rb +12 -32
  189. data/lib/active_support/number_helper.rb +379 -304
  190. data/lib/active_support/option_merger.rb +11 -18
  191. data/lib/active_support/ordered_hash.rb +4 -4
  192. data/lib/active_support/ordered_options.rb +23 -3
  193. data/lib/active_support/parameter_filter.rb +104 -75
  194. data/lib/active_support/proxy_object.rb +2 -0
  195. data/lib/active_support/rails.rb +1 -4
  196. data/lib/active_support/railtie.rb +90 -6
  197. data/lib/active_support/reloader.rb +12 -4
  198. data/lib/active_support/rescuable.rb +18 -16
  199. data/lib/active_support/ruby_features.rb +7 -0
  200. data/lib/active_support/secure_compare_rotator.rb +58 -0
  201. data/lib/active_support/security_utils.rb +19 -12
  202. data/lib/active_support/string_inquirer.rb +5 -3
  203. data/lib/active_support/subscriber.rb +23 -47
  204. data/lib/active_support/syntax_error_proxy.rb +70 -0
  205. data/lib/active_support/tagged_logging.rb +84 -23
  206. data/lib/active_support/test_case.rb +166 -27
  207. data/lib/active_support/testing/assertions.rb +73 -20
  208. data/lib/active_support/testing/autorun.rb +0 -2
  209. data/lib/active_support/testing/constant_stubbing.rb +32 -0
  210. data/lib/active_support/testing/deprecation.rb +53 -2
  211. data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
  212. data/lib/active_support/testing/isolation.rb +30 -29
  213. data/lib/active_support/testing/method_call_assertions.rb +24 -11
  214. data/lib/active_support/testing/parallelization/server.rb +82 -0
  215. data/lib/active_support/testing/parallelization/worker.rb +103 -0
  216. data/lib/active_support/testing/parallelization.rb +16 -95
  217. data/lib/active_support/testing/parallelize_executor.rb +81 -0
  218. data/lib/active_support/testing/stream.rb +4 -6
  219. data/lib/active_support/testing/strict_warnings.rb +39 -0
  220. data/lib/active_support/testing/tagged_logging.rb +1 -1
  221. data/lib/active_support/testing/time_helpers.rb +89 -19
  222. data/lib/active_support/time_with_zone.rb +105 -70
  223. data/lib/active_support/values/time_zone.rb +59 -26
  224. data/lib/active_support/version.rb +1 -1
  225. data/lib/active_support/xml_mini/jdom.rb +4 -11
  226. data/lib/active_support/xml_mini/libxml.rb +5 -5
  227. data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
  228. data/lib/active_support/xml_mini/nokogiri.rb +5 -5
  229. data/lib/active_support/xml_mini/nokogirisax.rb +2 -2
  230. data/lib/active_support/xml_mini/rexml.rb +9 -2
  231. data/lib/active_support/xml_mini.rb +7 -6
  232. data/lib/active_support.rb +40 -1
  233. metadata +127 -40
  234. data/lib/active_support/core_ext/array/prepend_and_append.rb +0 -5
  235. data/lib/active_support/core_ext/hash/compact.rb +0 -5
  236. data/lib/active_support/core_ext/hash/transform_values.rb +0 -5
  237. data/lib/active_support/core_ext/marshal.rb +0 -24
  238. data/lib/active_support/core_ext/module/reachable.rb +0 -6
  239. data/lib/active_support/core_ext/numeric/inquiry.rb +0 -5
  240. data/lib/active_support/core_ext/range/include_range.rb +0 -9
  241. data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -23
  242. data/lib/active_support/core_ext/range/overlaps.rb +0 -10
  243. data/lib/active_support/core_ext/uri.rb +0 -25
  244. data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
  245. data/lib/active_support/per_thread_registry.rb +0 -60
@@ -0,0 +1,292 @@
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: :to_s,
90
+ unpacker: :new
91
+
92
+ registry.register_type 15, Pathname,
93
+ packer: :to_s,
94
+ unpacker: :new
95
+
96
+ registry.register_type 16, Regexp,
97
+ packer: :to_s,
98
+ unpacker: :new
99
+
100
+ registry.register_type 17, ActiveSupport::HashWithIndifferentAccess,
101
+ packer: method(:write_hash_with_indifferent_access),
102
+ unpacker: method(:read_hash_with_indifferent_access),
103
+ recursive: true
104
+ end
105
+
106
+ def install_unregistered_type_error(registry)
107
+ registry.register_type 127, Object,
108
+ packer: method(:raise_unserializable),
109
+ unpacker: method(:raise_invalid_format)
110
+ end
111
+
112
+ def install_unregistered_type_fallback(registry)
113
+ registry.register_type 127, Object,
114
+ packer: method(:write_object),
115
+ unpacker: method(:read_object),
116
+ recursive: true
117
+ end
118
+
119
+ def write_rational(rational, packer)
120
+ packer.write(rational.numerator)
121
+ packer.write(rational.denominator) unless rational.numerator.zero?
122
+ end
123
+
124
+ def read_rational(unpacker)
125
+ numerator = unpacker.read
126
+ Rational(numerator, numerator.zero? ? 1 : unpacker.read)
127
+ end
128
+
129
+ def write_complex(complex, packer)
130
+ packer.write(complex.real)
131
+ packer.write(complex.imaginary)
132
+ end
133
+
134
+ def read_complex(unpacker)
135
+ Complex(unpacker.read, unpacker.read)
136
+ end
137
+
138
+ def write_datetime(datetime, packer)
139
+ packer.write(datetime.jd)
140
+ packer.write(datetime.hour)
141
+ packer.write(datetime.min)
142
+ packer.write(datetime.sec)
143
+ write_rational(datetime.sec_fraction, packer)
144
+ write_rational(datetime.offset, packer)
145
+ end
146
+
147
+ def read_datetime(unpacker)
148
+ DateTime.jd(unpacker.read, unpacker.read, unpacker.read, unpacker.read + read_rational(unpacker), read_rational(unpacker))
149
+ end
150
+
151
+ def write_date(date, packer)
152
+ packer.write(date.jd)
153
+ end
154
+
155
+ def read_date(unpacker)
156
+ Date.jd(unpacker.read)
157
+ end
158
+
159
+ def write_time(time, packer)
160
+ packer.write(time.tv_sec)
161
+ packer.write(time.tv_nsec)
162
+ packer.write(time.utc_offset)
163
+ end
164
+
165
+ def read_time(unpacker)
166
+ Time.at_without_coercion(unpacker.read, unpacker.read, :nanosecond, in: unpacker.read)
167
+ end
168
+
169
+ def write_time_with_zone(twz, packer)
170
+ write_time(twz.utc, packer)
171
+ write_time_zone(twz.time_zone, packer)
172
+ end
173
+
174
+ def read_time_with_zone(unpacker)
175
+ ActiveSupport::TimeWithZone.new(read_time(unpacker), read_time_zone(unpacker))
176
+ end
177
+
178
+ def dump_time_zone(time_zone)
179
+ time_zone.name
180
+ end
181
+
182
+ def load_time_zone(name)
183
+ ActiveSupport::TimeZone[name]
184
+ end
185
+
186
+ def write_time_zone(time_zone, packer)
187
+ packer.write(dump_time_zone(time_zone))
188
+ end
189
+
190
+ def read_time_zone(unpacker)
191
+ load_time_zone(unpacker.read)
192
+ end
193
+
194
+ def write_duration(duration, packer)
195
+ packer.write(duration.value)
196
+ packer.write(duration._parts.values_at(*ActiveSupport::Duration::PARTS))
197
+ end
198
+
199
+ def read_duration(unpacker)
200
+ value = unpacker.read
201
+ parts = ActiveSupport::Duration::PARTS.zip(unpacker.read).to_h
202
+ parts.compact!
203
+ ActiveSupport::Duration.new(value, parts)
204
+ end
205
+
206
+ def write_range(range, packer)
207
+ packer.write(range.begin)
208
+ packer.write(range.end)
209
+ packer.write(range.exclude_end?)
210
+ end
211
+
212
+ def read_range(unpacker)
213
+ Range.new(unpacker.read, unpacker.read, unpacker.read)
214
+ end
215
+
216
+ def write_set(set, packer)
217
+ packer.write(set.to_a)
218
+ end
219
+
220
+ def read_set(unpacker)
221
+ Set.new(unpacker.read)
222
+ end
223
+
224
+ def write_hash_with_indifferent_access(hwia, packer)
225
+ packer.write(hwia.to_h)
226
+ end
227
+
228
+ def read_hash_with_indifferent_access(unpacker)
229
+ ActiveSupport::HashWithIndifferentAccess.new(unpacker.read)
230
+ end
231
+
232
+ def raise_unserializable(object, *)
233
+ raise UnserializableObjectError, "Unsupported type #{object.class} for object #{object.inspect}"
234
+ end
235
+
236
+ def raise_invalid_format(*)
237
+ raise "Invalid format"
238
+ end
239
+
240
+ def dump_class(klass)
241
+ raise UnserializableObjectError, "Cannot serialize anonymous class" unless klass.name
242
+ klass.name
243
+ end
244
+
245
+ def load_class(name)
246
+ Object.const_get(name)
247
+ rescue NameError => error
248
+ if error.name.to_s == name
249
+ raise MissingClassError, "Missing class: #{name}"
250
+ else
251
+ raise
252
+ end
253
+ end
254
+
255
+ def write_class(klass, packer)
256
+ packer.write(dump_class(klass))
257
+ end
258
+
259
+ def read_class(unpacker)
260
+ load_class(unpacker.read)
261
+ end
262
+
263
+ LOAD_WITH_MSGPACK_EXT = 0
264
+ LOAD_WITH_JSON_CREATE = 1
265
+
266
+ def write_object(object, packer)
267
+ if object.class.respond_to?(:from_msgpack_ext)
268
+ packer.write(LOAD_WITH_MSGPACK_EXT)
269
+ write_class(object.class, packer)
270
+ packer.write(object.to_msgpack_ext)
271
+ elsif object.class.respond_to?(:json_create)
272
+ packer.write(LOAD_WITH_JSON_CREATE)
273
+ write_class(object.class, packer)
274
+ packer.write(object.as_json)
275
+ else
276
+ raise_unserializable(object)
277
+ end
278
+ end
279
+
280
+ def read_object(unpacker)
281
+ case unpacker.read
282
+ when LOAD_WITH_MSGPACK_EXT
283
+ read_class(unpacker).from_msgpack_ext(unpacker.read)
284
+ when LOAD_WITH_JSON_CREATE
285
+ read_class(unpacker).json_create(unpacker.read)
286
+ else
287
+ raise_invalid_format
288
+ end
289
+ end
290
+ end
291
+ end
292
+ 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