activesupport 6.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activesupport might be problematic. Click here for more details.

Files changed (250) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +572 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +40 -0
  5. data/lib/active_support.rb +96 -0
  6. data/lib/active_support/actionable_error.rb +48 -0
  7. data/lib/active_support/all.rb +5 -0
  8. data/lib/active_support/array_inquirer.rb +48 -0
  9. data/lib/active_support/backtrace_cleaner.rb +132 -0
  10. data/lib/active_support/benchmarkable.rb +51 -0
  11. data/lib/active_support/builder.rb +8 -0
  12. data/lib/active_support/cache.rb +830 -0
  13. data/lib/active_support/cache/file_store.rb +196 -0
  14. data/lib/active_support/cache/mem_cache_store.rb +212 -0
  15. data/lib/active_support/cache/memory_store.rb +174 -0
  16. data/lib/active_support/cache/null_store.rb +48 -0
  17. data/lib/active_support/cache/redis_cache_store.rb +488 -0
  18. data/lib/active_support/cache/strategy/local_cache.rb +194 -0
  19. data/lib/active_support/cache/strategy/local_cache_middleware.rb +45 -0
  20. data/lib/active_support/callbacks.rb +856 -0
  21. data/lib/active_support/concern.rb +171 -0
  22. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +17 -0
  23. data/lib/active_support/concurrency/share_lock.rb +227 -0
  24. data/lib/active_support/configurable.rb +146 -0
  25. data/lib/active_support/core_ext.rb +5 -0
  26. data/lib/active_support/core_ext/array.rb +9 -0
  27. data/lib/active_support/core_ext/array/access.rb +104 -0
  28. data/lib/active_support/core_ext/array/conversions.rb +213 -0
  29. data/lib/active_support/core_ext/array/extract.rb +21 -0
  30. data/lib/active_support/core_ext/array/extract_options.rb +31 -0
  31. data/lib/active_support/core_ext/array/grouping.rb +109 -0
  32. data/lib/active_support/core_ext/array/inquiry.rb +19 -0
  33. data/lib/active_support/core_ext/array/prepend_and_append.rb +5 -0
  34. data/lib/active_support/core_ext/array/wrap.rb +48 -0
  35. data/lib/active_support/core_ext/benchmark.rb +16 -0
  36. data/lib/active_support/core_ext/big_decimal.rb +3 -0
  37. data/lib/active_support/core_ext/big_decimal/conversions.rb +14 -0
  38. data/lib/active_support/core_ext/class.rb +4 -0
  39. data/lib/active_support/core_ext/class/attribute.rb +141 -0
  40. data/lib/active_support/core_ext/class/attribute_accessors.rb +6 -0
  41. data/lib/active_support/core_ext/class/subclasses.rb +54 -0
  42. data/lib/active_support/core_ext/date.rb +7 -0
  43. data/lib/active_support/core_ext/date/acts_like.rb +10 -0
  44. data/lib/active_support/core_ext/date/blank.rb +14 -0
  45. data/lib/active_support/core_ext/date/calculations.rb +146 -0
  46. data/lib/active_support/core_ext/date/conversions.rb +96 -0
  47. data/lib/active_support/core_ext/date/zones.rb +8 -0
  48. data/lib/active_support/core_ext/date_and_time/calculations.rb +351 -0
  49. data/lib/active_support/core_ext/date_and_time/compatibility.rb +16 -0
  50. data/lib/active_support/core_ext/date_and_time/zones.rb +41 -0
  51. data/lib/active_support/core_ext/date_time.rb +7 -0
  52. data/lib/active_support/core_ext/date_time/acts_like.rb +16 -0
  53. data/lib/active_support/core_ext/date_time/blank.rb +14 -0
  54. data/lib/active_support/core_ext/date_time/calculations.rb +211 -0
  55. data/lib/active_support/core_ext/date_time/compatibility.rb +18 -0
  56. data/lib/active_support/core_ext/date_time/conversions.rb +107 -0
  57. data/lib/active_support/core_ext/digest.rb +3 -0
  58. data/lib/active_support/core_ext/digest/uuid.rb +53 -0
  59. data/lib/active_support/core_ext/enumerable.rb +188 -0
  60. data/lib/active_support/core_ext/file.rb +3 -0
  61. data/lib/active_support/core_ext/file/atomic.rb +70 -0
  62. data/lib/active_support/core_ext/hash.rb +10 -0
  63. data/lib/active_support/core_ext/hash/compact.rb +5 -0
  64. data/lib/active_support/core_ext/hash/conversions.rb +263 -0
  65. data/lib/active_support/core_ext/hash/deep_merge.rb +34 -0
  66. data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
  67. data/lib/active_support/core_ext/hash/except.rb +24 -0
  68. data/lib/active_support/core_ext/hash/indifferent_access.rb +24 -0
  69. data/lib/active_support/core_ext/hash/keys.rb +143 -0
  70. data/lib/active_support/core_ext/hash/reverse_merge.rb +25 -0
  71. data/lib/active_support/core_ext/hash/slice.rb +26 -0
  72. data/lib/active_support/core_ext/hash/transform_values.rb +5 -0
  73. data/lib/active_support/core_ext/integer.rb +5 -0
  74. data/lib/active_support/core_ext/integer/inflections.rb +31 -0
  75. data/lib/active_support/core_ext/integer/multiple.rb +12 -0
  76. data/lib/active_support/core_ext/integer/time.rb +22 -0
  77. data/lib/active_support/core_ext/kernel.rb +5 -0
  78. data/lib/active_support/core_ext/kernel/concern.rb +14 -0
  79. data/lib/active_support/core_ext/kernel/reporting.rb +45 -0
  80. data/lib/active_support/core_ext/kernel/singleton_class.rb +8 -0
  81. data/lib/active_support/core_ext/load_error.rb +9 -0
  82. data/lib/active_support/core_ext/marshal.rb +24 -0
  83. data/lib/active_support/core_ext/module.rb +13 -0
  84. data/lib/active_support/core_ext/module/aliasing.rb +31 -0
  85. data/lib/active_support/core_ext/module/anonymous.rb +30 -0
  86. data/lib/active_support/core_ext/module/attr_internal.rb +38 -0
  87. data/lib/active_support/core_ext/module/attribute_accessors.rb +212 -0
  88. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +144 -0
  89. data/lib/active_support/core_ext/module/concerning.rb +134 -0
  90. data/lib/active_support/core_ext/module/delegation.rb +313 -0
  91. data/lib/active_support/core_ext/module/deprecation.rb +25 -0
  92. data/lib/active_support/core_ext/module/introspection.rb +86 -0
  93. data/lib/active_support/core_ext/module/reachable.rb +6 -0
  94. data/lib/active_support/core_ext/module/redefine_method.rb +40 -0
  95. data/lib/active_support/core_ext/module/remove_method.rb +17 -0
  96. data/lib/active_support/core_ext/name_error.rb +38 -0
  97. data/lib/active_support/core_ext/numeric.rb +5 -0
  98. data/lib/active_support/core_ext/numeric/bytes.rb +66 -0
  99. data/lib/active_support/core_ext/numeric/conversions.rb +136 -0
  100. data/lib/active_support/core_ext/numeric/inquiry.rb +5 -0
  101. data/lib/active_support/core_ext/numeric/time.rb +66 -0
  102. data/lib/active_support/core_ext/object.rb +16 -0
  103. data/lib/active_support/core_ext/object/acts_like.rb +21 -0
  104. data/lib/active_support/core_ext/object/blank.rb +155 -0
  105. data/lib/active_support/core_ext/object/conversions.rb +6 -0
  106. data/lib/active_support/core_ext/object/deep_dup.rb +55 -0
  107. data/lib/active_support/core_ext/object/duplicable.rb +49 -0
  108. data/lib/active_support/core_ext/object/inclusion.rb +29 -0
  109. data/lib/active_support/core_ext/object/instance_variables.rb +30 -0
  110. data/lib/active_support/core_ext/object/json.rb +228 -0
  111. data/lib/active_support/core_ext/object/to_param.rb +3 -0
  112. data/lib/active_support/core_ext/object/to_query.rb +89 -0
  113. data/lib/active_support/core_ext/object/try.rb +156 -0
  114. data/lib/active_support/core_ext/object/with_options.rb +82 -0
  115. data/lib/active_support/core_ext/range.rb +7 -0
  116. data/lib/active_support/core_ext/range/compare_range.rb +70 -0
  117. data/lib/active_support/core_ext/range/conversions.rb +41 -0
  118. data/lib/active_support/core_ext/range/each.rb +25 -0
  119. data/lib/active_support/core_ext/range/include_range.rb +9 -0
  120. data/lib/active_support/core_ext/range/include_time_with_zone.rb +23 -0
  121. data/lib/active_support/core_ext/range/overlaps.rb +10 -0
  122. data/lib/active_support/core_ext/regexp.rb +7 -0
  123. data/lib/active_support/core_ext/securerandom.rb +45 -0
  124. data/lib/active_support/core_ext/string.rb +15 -0
  125. data/lib/active_support/core_ext/string/access.rb +114 -0
  126. data/lib/active_support/core_ext/string/behavior.rb +8 -0
  127. data/lib/active_support/core_ext/string/conversions.rb +59 -0
  128. data/lib/active_support/core_ext/string/exclude.rb +13 -0
  129. data/lib/active_support/core_ext/string/filters.rb +145 -0
  130. data/lib/active_support/core_ext/string/indent.rb +45 -0
  131. data/lib/active_support/core_ext/string/inflections.rb +259 -0
  132. data/lib/active_support/core_ext/string/inquiry.rb +15 -0
  133. data/lib/active_support/core_ext/string/multibyte.rb +58 -0
  134. data/lib/active_support/core_ext/string/output_safety.rb +314 -0
  135. data/lib/active_support/core_ext/string/starts_ends_with.rb +6 -0
  136. data/lib/active_support/core_ext/string/strip.rb +27 -0
  137. data/lib/active_support/core_ext/string/zones.rb +16 -0
  138. data/lib/active_support/core_ext/time.rb +7 -0
  139. data/lib/active_support/core_ext/time/acts_like.rb +10 -0
  140. data/lib/active_support/core_ext/time/calculations.rb +344 -0
  141. data/lib/active_support/core_ext/time/compatibility.rb +16 -0
  142. data/lib/active_support/core_ext/time/conversions.rb +72 -0
  143. data/lib/active_support/core_ext/time/zones.rb +113 -0
  144. data/lib/active_support/core_ext/uri.rb +25 -0
  145. data/lib/active_support/current_attributes.rb +203 -0
  146. data/lib/active_support/dependencies.rb +806 -0
  147. data/lib/active_support/dependencies/autoload.rb +79 -0
  148. data/lib/active_support/dependencies/interlock.rb +57 -0
  149. data/lib/active_support/dependencies/zeitwerk_integration.rb +110 -0
  150. data/lib/active_support/deprecation.rb +46 -0
  151. data/lib/active_support/deprecation/behaviors.rb +109 -0
  152. data/lib/active_support/deprecation/constant_accessor.rb +52 -0
  153. data/lib/active_support/deprecation/instance_delegator.rb +39 -0
  154. data/lib/active_support/deprecation/method_wrappers.rb +78 -0
  155. data/lib/active_support/deprecation/proxy_wrappers.rb +173 -0
  156. data/lib/active_support/deprecation/reporting.rb +114 -0
  157. data/lib/active_support/descendants_tracker.rb +109 -0
  158. data/lib/active_support/digest.rb +20 -0
  159. data/lib/active_support/duration.rb +433 -0
  160. data/lib/active_support/duration/iso8601_parser.rb +124 -0
  161. data/lib/active_support/duration/iso8601_serializer.rb +54 -0
  162. data/lib/active_support/encrypted_configuration.rb +45 -0
  163. data/lib/active_support/encrypted_file.rb +100 -0
  164. data/lib/active_support/evented_file_update_checker.rb +235 -0
  165. data/lib/active_support/execution_wrapper.rb +129 -0
  166. data/lib/active_support/executor.rb +8 -0
  167. data/lib/active_support/file_update_checker.rb +163 -0
  168. data/lib/active_support/gem_version.rb +17 -0
  169. data/lib/active_support/gzip.rb +38 -0
  170. data/lib/active_support/hash_with_indifferent_access.rb +399 -0
  171. data/lib/active_support/i18n.rb +16 -0
  172. data/lib/active_support/i18n_railtie.rb +126 -0
  173. data/lib/active_support/inflections.rb +72 -0
  174. data/lib/active_support/inflector.rb +9 -0
  175. data/lib/active_support/inflector/inflections.rb +257 -0
  176. data/lib/active_support/inflector/methods.rb +398 -0
  177. data/lib/active_support/inflector/transliterate.rb +147 -0
  178. data/lib/active_support/json.rb +4 -0
  179. data/lib/active_support/json/decoding.rb +76 -0
  180. data/lib/active_support/json/encoding.rb +134 -0
  181. data/lib/active_support/key_generator.rb +41 -0
  182. data/lib/active_support/lazy_load_hooks.rb +82 -0
  183. data/lib/active_support/locale/en.rb +31 -0
  184. data/lib/active_support/locale/en.yml +135 -0
  185. data/lib/active_support/log_subscriber.rb +135 -0
  186. data/lib/active_support/log_subscriber/test_helper.rb +106 -0
  187. data/lib/active_support/logger.rb +93 -0
  188. data/lib/active_support/logger_silence.rb +45 -0
  189. data/lib/active_support/logger_thread_safe_level.rb +56 -0
  190. data/lib/active_support/message_encryptor.rb +227 -0
  191. data/lib/active_support/message_verifier.rb +205 -0
  192. data/lib/active_support/messages/metadata.rb +71 -0
  193. data/lib/active_support/messages/rotation_configuration.rb +22 -0
  194. data/lib/active_support/messages/rotator.rb +56 -0
  195. data/lib/active_support/multibyte.rb +23 -0
  196. data/lib/active_support/multibyte/chars.rb +216 -0
  197. data/lib/active_support/multibyte/unicode.rb +157 -0
  198. data/lib/active_support/notifications.rb +253 -0
  199. data/lib/active_support/notifications/fanout.rb +244 -0
  200. data/lib/active_support/notifications/instrumenter.rb +164 -0
  201. data/lib/active_support/number_helper.rb +378 -0
  202. data/lib/active_support/number_helper/number_converter.rb +184 -0
  203. data/lib/active_support/number_helper/number_to_currency_converter.rb +46 -0
  204. data/lib/active_support/number_helper/number_to_delimited_converter.rb +31 -0
  205. data/lib/active_support/number_helper/number_to_human_converter.rb +70 -0
  206. data/lib/active_support/number_helper/number_to_human_size_converter.rb +61 -0
  207. data/lib/active_support/number_helper/number_to_percentage_converter.rb +16 -0
  208. data/lib/active_support/number_helper/number_to_phone_converter.rb +60 -0
  209. data/lib/active_support/number_helper/number_to_rounded_converter.rb +56 -0
  210. data/lib/active_support/number_helper/rounding_helper.rb +66 -0
  211. data/lib/active_support/option_merger.rb +27 -0
  212. data/lib/active_support/ordered_hash.rb +50 -0
  213. data/lib/active_support/ordered_options.rb +85 -0
  214. data/lib/active_support/parameter_filter.rb +129 -0
  215. data/lib/active_support/per_thread_registry.rb +60 -0
  216. data/lib/active_support/proxy_object.rb +15 -0
  217. data/lib/active_support/rails.rb +29 -0
  218. data/lib/active_support/railtie.rb +80 -0
  219. data/lib/active_support/reloader.rb +130 -0
  220. data/lib/active_support/rescuable.rb +174 -0
  221. data/lib/active_support/security_utils.rb +31 -0
  222. data/lib/active_support/string_inquirer.rb +34 -0
  223. data/lib/active_support/subscriber.rb +169 -0
  224. data/lib/active_support/tagged_logging.rb +88 -0
  225. data/lib/active_support/test_case.rb +163 -0
  226. data/lib/active_support/testing/assertions.rb +228 -0
  227. data/lib/active_support/testing/autorun.rb +7 -0
  228. data/lib/active_support/testing/constant_lookup.rb +51 -0
  229. data/lib/active_support/testing/declarative.rb +28 -0
  230. data/lib/active_support/testing/deprecation.rb +38 -0
  231. data/lib/active_support/testing/file_fixtures.rb +38 -0
  232. data/lib/active_support/testing/isolation.rb +110 -0
  233. data/lib/active_support/testing/method_call_assertions.rb +70 -0
  234. data/lib/active_support/testing/parallelization.rb +128 -0
  235. data/lib/active_support/testing/setup_and_teardown.rb +55 -0
  236. data/lib/active_support/testing/stream.rb +44 -0
  237. data/lib/active_support/testing/tagged_logging.rb +27 -0
  238. data/lib/active_support/testing/time_helpers.rb +200 -0
  239. data/lib/active_support/time.rb +20 -0
  240. data/lib/active_support/time_with_zone.rb +561 -0
  241. data/lib/active_support/values/time_zone.rb +570 -0
  242. data/lib/active_support/version.rb +10 -0
  243. data/lib/active_support/xml_mini.rb +202 -0
  244. data/lib/active_support/xml_mini/jdom.rb +183 -0
  245. data/lib/active_support/xml_mini/libxml.rb +80 -0
  246. data/lib/active_support/xml_mini/libxmlsax.rb +83 -0
  247. data/lib/active_support/xml_mini/nokogiri.rb +83 -0
  248. data/lib/active_support/xml_mini/nokogirisax.rb +86 -0
  249. data/lib/active_support/xml_mini/rexml.rb +130 -0
  250. metadata +385 -0
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "libxml"
4
+ require "active_support/core_ext/object/blank"
5
+ require "stringio"
6
+
7
+ module ActiveSupport
8
+ module XmlMini_LibXMLSAX #:nodoc:
9
+ extend self
10
+
11
+ # Class that will build the hash while the XML document
12
+ # is being parsed using SAX events.
13
+ class HashBuilder
14
+ include LibXML::XML::SaxParser::Callbacks
15
+
16
+ CONTENT_KEY = "__content__"
17
+ HASH_SIZE_KEY = "__hash_size__"
18
+
19
+ attr_reader :hash
20
+
21
+ def current_hash
22
+ @hash_stack.last
23
+ end
24
+
25
+ def on_start_document
26
+ @hash = { CONTENT_KEY => +"" }
27
+ @hash_stack = [@hash]
28
+ end
29
+
30
+ def on_end_document
31
+ @hash = @hash_stack.pop
32
+ @hash.delete(CONTENT_KEY)
33
+ end
34
+
35
+ def on_start_element(name, attrs = {})
36
+ new_hash = { CONTENT_KEY => +"" }.merge!(attrs)
37
+ new_hash[HASH_SIZE_KEY] = new_hash.size + 1
38
+
39
+ case current_hash[name]
40
+ when Array then current_hash[name] << new_hash
41
+ when Hash then current_hash[name] = [current_hash[name], new_hash]
42
+ when nil then current_hash[name] = new_hash
43
+ end
44
+
45
+ @hash_stack.push(new_hash)
46
+ end
47
+
48
+ def on_end_element(name)
49
+ if current_hash.length > current_hash.delete(HASH_SIZE_KEY) && current_hash[CONTENT_KEY].blank? || current_hash[CONTENT_KEY] == ""
50
+ current_hash.delete(CONTENT_KEY)
51
+ end
52
+ @hash_stack.pop
53
+ end
54
+
55
+ def on_characters(string)
56
+ current_hash[CONTENT_KEY] << string
57
+ end
58
+
59
+ alias_method :on_cdata_block, :on_characters
60
+ end
61
+
62
+ attr_accessor :document_class
63
+ self.document_class = HashBuilder
64
+
65
+ def parse(data)
66
+ if !data.respond_to?(:read)
67
+ data = StringIO.new(data || "")
68
+ end
69
+
70
+ if data.eof?
71
+ {}
72
+ else
73
+ LibXML::XML::Error.set_handler(&LibXML::XML::Error::QUIET_HANDLER)
74
+ parser = LibXML::XML::SaxParser.io(data)
75
+ document = document_class.new
76
+
77
+ parser.callbacks = document
78
+ parser.parse
79
+ document.hash
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require "nokogiri"
5
+ rescue LoadError => e
6
+ $stderr.puts "You don't have nokogiri installed in your application. Please add it to your Gemfile and run bundle install"
7
+ raise e
8
+ end
9
+ require "active_support/core_ext/object/blank"
10
+ require "stringio"
11
+
12
+ module ActiveSupport
13
+ module XmlMini_Nokogiri #:nodoc:
14
+ extend self
15
+
16
+ # Parse an XML Document string or IO into a simple hash using libxml / nokogiri.
17
+ # data::
18
+ # XML Document string or IO to parse
19
+ def parse(data)
20
+ if !data.respond_to?(:read)
21
+ data = StringIO.new(data || "")
22
+ end
23
+
24
+ if data.eof?
25
+ {}
26
+ else
27
+ doc = Nokogiri::XML(data)
28
+ raise doc.errors.first if doc.errors.length > 0
29
+ doc.to_hash
30
+ end
31
+ end
32
+
33
+ module Conversions #:nodoc:
34
+ module Document #:nodoc:
35
+ def to_hash
36
+ root.to_hash
37
+ end
38
+ end
39
+
40
+ module Node #:nodoc:
41
+ CONTENT_ROOT = "__content__"
42
+
43
+ # Convert XML document to hash.
44
+ #
45
+ # hash::
46
+ # Hash to merge the converted element into.
47
+ def to_hash(hash = {})
48
+ node_hash = {}
49
+
50
+ # Insert node hash into parent hash correctly.
51
+ case hash[name]
52
+ when Array then hash[name] << node_hash
53
+ when Hash then hash[name] = [hash[name], node_hash]
54
+ when nil then hash[name] = node_hash
55
+ end
56
+
57
+ # Handle child elements
58
+ children.each do |c|
59
+ if c.element?
60
+ c.to_hash(node_hash)
61
+ elsif c.text? || c.cdata?
62
+ node_hash[CONTENT_ROOT] ||= +""
63
+ node_hash[CONTENT_ROOT] << c.content
64
+ end
65
+ end
66
+
67
+ # Remove content node if it is blank and there are child tags
68
+ if node_hash.length > 1 && node_hash[CONTENT_ROOT].blank?
69
+ node_hash.delete(CONTENT_ROOT)
70
+ end
71
+
72
+ # Handle attributes
73
+ attribute_nodes.each { |a| node_hash[a.node_name] = a.value }
74
+
75
+ hash
76
+ end
77
+ end
78
+ end
79
+
80
+ Nokogiri::XML::Document.include(Conversions::Document)
81
+ Nokogiri::XML::Node.include(Conversions::Node)
82
+ end
83
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require "nokogiri"
5
+ rescue LoadError => e
6
+ $stderr.puts "You don't have nokogiri installed in your application. Please add it to your Gemfile and run bundle install"
7
+ raise e
8
+ end
9
+ require "active_support/core_ext/object/blank"
10
+ require "stringio"
11
+
12
+ module ActiveSupport
13
+ module XmlMini_NokogiriSAX #:nodoc:
14
+ extend self
15
+
16
+ # Class that will build the hash while the XML document
17
+ # is being parsed using SAX events.
18
+ class HashBuilder < Nokogiri::XML::SAX::Document
19
+ CONTENT_KEY = "__content__"
20
+ HASH_SIZE_KEY = "__hash_size__"
21
+
22
+ attr_reader :hash
23
+
24
+ def current_hash
25
+ @hash_stack.last
26
+ end
27
+
28
+ def start_document
29
+ @hash = {}
30
+ @hash_stack = [@hash]
31
+ end
32
+
33
+ def end_document
34
+ raise "Parse stack not empty!" if @hash_stack.size > 1
35
+ end
36
+
37
+ def error(error_message)
38
+ raise error_message
39
+ end
40
+
41
+ def start_element(name, attrs = [])
42
+ new_hash = { CONTENT_KEY => +"" }.merge!(Hash[attrs])
43
+ new_hash[HASH_SIZE_KEY] = new_hash.size + 1
44
+
45
+ case current_hash[name]
46
+ when Array then current_hash[name] << new_hash
47
+ when Hash then current_hash[name] = [current_hash[name], new_hash]
48
+ when nil then current_hash[name] = new_hash
49
+ end
50
+
51
+ @hash_stack.push(new_hash)
52
+ end
53
+
54
+ def end_element(name)
55
+ if current_hash.length > current_hash.delete(HASH_SIZE_KEY) && current_hash[CONTENT_KEY].blank? || current_hash[CONTENT_KEY] == ""
56
+ current_hash.delete(CONTENT_KEY)
57
+ end
58
+ @hash_stack.pop
59
+ end
60
+
61
+ def characters(string)
62
+ current_hash[CONTENT_KEY] << string
63
+ end
64
+
65
+ alias_method :cdata_block, :characters
66
+ end
67
+
68
+ attr_accessor :document_class
69
+ self.document_class = HashBuilder
70
+
71
+ def parse(data)
72
+ if !data.respond_to?(:read)
73
+ data = StringIO.new(data || "")
74
+ end
75
+
76
+ if data.eof?
77
+ {}
78
+ else
79
+ document = document_class.new
80
+ parser = Nokogiri::XML::SAX::Parser.new(document)
81
+ parser.parse(data)
82
+ document.hash
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/kernel/reporting"
4
+ require "active_support/core_ext/object/blank"
5
+ require "stringio"
6
+
7
+ module ActiveSupport
8
+ module XmlMini_REXML #:nodoc:
9
+ extend self
10
+
11
+ CONTENT_KEY = "__content__"
12
+
13
+ # Parse an XML Document string or IO into a simple hash.
14
+ #
15
+ # Same as XmlSimple::xml_in but doesn't shoot itself in the foot,
16
+ # and uses the defaults from Active Support.
17
+ #
18
+ # data::
19
+ # XML Document string or IO to parse
20
+ def parse(data)
21
+ if !data.respond_to?(:read)
22
+ data = StringIO.new(data || "")
23
+ end
24
+
25
+ if data.eof?
26
+ {}
27
+ else
28
+ silence_warnings { require "rexml/document" } unless defined?(REXML::Document)
29
+ doc = REXML::Document.new(data)
30
+
31
+ if doc.root
32
+ merge_element!({}, doc.root, XmlMini.depth)
33
+ else
34
+ raise REXML::ParseException,
35
+ "The document #{doc.to_s.inspect} does not have a valid root"
36
+ end
37
+ end
38
+ end
39
+
40
+ private
41
+ # Convert an XML element and merge into the hash
42
+ #
43
+ # hash::
44
+ # Hash to merge the converted element into.
45
+ # element::
46
+ # XML element to merge into hash
47
+ def merge_element!(hash, element, depth)
48
+ raise REXML::ParseException, "The document is too deep" if depth == 0
49
+ merge!(hash, element.name, collapse(element, depth))
50
+ end
51
+
52
+ # Actually converts an XML document element into a data structure.
53
+ #
54
+ # element::
55
+ # The document element to be collapsed.
56
+ def collapse(element, depth)
57
+ hash = get_attributes(element)
58
+
59
+ if element.has_elements?
60
+ element.each_element { |child| merge_element!(hash, child, depth - 1) }
61
+ merge_texts!(hash, element) unless empty_content?(element)
62
+ hash
63
+ else
64
+ merge_texts!(hash, element)
65
+ end
66
+ end
67
+
68
+ # Merge all the texts of an element into the hash
69
+ #
70
+ # hash::
71
+ # Hash to add the converted element to.
72
+ # element::
73
+ # XML element whose texts are to me merged into the hash
74
+ def merge_texts!(hash, element)
75
+ unless element.has_text?
76
+ hash
77
+ else
78
+ # must use value to prevent double-escaping
79
+ texts = +""
80
+ element.texts.each { |t| texts << t.value }
81
+ merge!(hash, CONTENT_KEY, texts)
82
+ end
83
+ end
84
+
85
+ # Adds a new key/value pair to an existing Hash. If the key to be added
86
+ # already exists and the existing value associated with key is not
87
+ # an Array, it will be wrapped in an Array. Then the new value is
88
+ # appended to that Array.
89
+ #
90
+ # hash::
91
+ # Hash to add key/value pair to.
92
+ # key::
93
+ # Key to be added.
94
+ # value::
95
+ # Value to be associated with key.
96
+ def merge!(hash, key, value)
97
+ if hash.has_key?(key)
98
+ if hash[key].instance_of?(Array)
99
+ hash[key] << value
100
+ else
101
+ hash[key] = [hash[key], value]
102
+ end
103
+ elsif value.instance_of?(Array)
104
+ hash[key] = [value]
105
+ else
106
+ hash[key] = value
107
+ end
108
+ hash
109
+ end
110
+
111
+ # Converts the attributes array of an XML element into a hash.
112
+ # Returns an empty Hash if node has no attributes.
113
+ #
114
+ # element::
115
+ # XML element to extract attributes from.
116
+ def get_attributes(element)
117
+ attributes = {}
118
+ element.attributes.each { |n, v| attributes[n] = v }
119
+ attributes
120
+ end
121
+
122
+ # Determines if a document element has text content
123
+ #
124
+ # element::
125
+ # XML element to be checked.
126
+ def empty_content?(element)
127
+ element.texts.join.blank?
128
+ end
129
+ end
130
+ end
metadata ADDED
@@ -0,0 +1,385 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activesupport
3
+ version: !ruby/object:Gem::Version
4
+ version: 6.0.0
5
+ platform: ruby
6
+ authors:
7
+ - David Heinemeier Hansson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-08-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: i18n
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '0.7'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: tzinfo
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.1'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.1'
47
+ - !ruby/object:Gem::Dependency
48
+ name: minitest
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '5.1'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '5.1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: concurrent-ruby
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.0'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.0.2
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.0'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 1.0.2
81
+ - !ruby/object:Gem::Dependency
82
+ name: zeitwerk
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '2.1'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 2.1.8
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '2.1'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 2.1.8
101
+ description: A toolkit of support libraries and Ruby core extensions extracted from
102
+ the Rails framework. Rich support for multibyte strings, internationalization, time
103
+ zones, and testing.
104
+ email: david@loudthinking.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - CHANGELOG.md
110
+ - MIT-LICENSE
111
+ - README.rdoc
112
+ - lib/active_support.rb
113
+ - lib/active_support/actionable_error.rb
114
+ - lib/active_support/all.rb
115
+ - lib/active_support/array_inquirer.rb
116
+ - lib/active_support/backtrace_cleaner.rb
117
+ - lib/active_support/benchmarkable.rb
118
+ - lib/active_support/builder.rb
119
+ - lib/active_support/cache.rb
120
+ - lib/active_support/cache/file_store.rb
121
+ - lib/active_support/cache/mem_cache_store.rb
122
+ - lib/active_support/cache/memory_store.rb
123
+ - lib/active_support/cache/null_store.rb
124
+ - lib/active_support/cache/redis_cache_store.rb
125
+ - lib/active_support/cache/strategy/local_cache.rb
126
+ - lib/active_support/cache/strategy/local_cache_middleware.rb
127
+ - lib/active_support/callbacks.rb
128
+ - lib/active_support/concern.rb
129
+ - lib/active_support/concurrency/load_interlock_aware_monitor.rb
130
+ - lib/active_support/concurrency/share_lock.rb
131
+ - lib/active_support/configurable.rb
132
+ - lib/active_support/core_ext.rb
133
+ - lib/active_support/core_ext/array.rb
134
+ - lib/active_support/core_ext/array/access.rb
135
+ - lib/active_support/core_ext/array/conversions.rb
136
+ - lib/active_support/core_ext/array/extract.rb
137
+ - lib/active_support/core_ext/array/extract_options.rb
138
+ - lib/active_support/core_ext/array/grouping.rb
139
+ - lib/active_support/core_ext/array/inquiry.rb
140
+ - lib/active_support/core_ext/array/prepend_and_append.rb
141
+ - lib/active_support/core_ext/array/wrap.rb
142
+ - lib/active_support/core_ext/benchmark.rb
143
+ - lib/active_support/core_ext/big_decimal.rb
144
+ - lib/active_support/core_ext/big_decimal/conversions.rb
145
+ - lib/active_support/core_ext/class.rb
146
+ - lib/active_support/core_ext/class/attribute.rb
147
+ - lib/active_support/core_ext/class/attribute_accessors.rb
148
+ - lib/active_support/core_ext/class/subclasses.rb
149
+ - lib/active_support/core_ext/date.rb
150
+ - lib/active_support/core_ext/date/acts_like.rb
151
+ - lib/active_support/core_ext/date/blank.rb
152
+ - lib/active_support/core_ext/date/calculations.rb
153
+ - lib/active_support/core_ext/date/conversions.rb
154
+ - lib/active_support/core_ext/date/zones.rb
155
+ - lib/active_support/core_ext/date_and_time/calculations.rb
156
+ - lib/active_support/core_ext/date_and_time/compatibility.rb
157
+ - lib/active_support/core_ext/date_and_time/zones.rb
158
+ - lib/active_support/core_ext/date_time.rb
159
+ - lib/active_support/core_ext/date_time/acts_like.rb
160
+ - lib/active_support/core_ext/date_time/blank.rb
161
+ - lib/active_support/core_ext/date_time/calculations.rb
162
+ - lib/active_support/core_ext/date_time/compatibility.rb
163
+ - lib/active_support/core_ext/date_time/conversions.rb
164
+ - lib/active_support/core_ext/digest.rb
165
+ - lib/active_support/core_ext/digest/uuid.rb
166
+ - lib/active_support/core_ext/enumerable.rb
167
+ - lib/active_support/core_ext/file.rb
168
+ - lib/active_support/core_ext/file/atomic.rb
169
+ - lib/active_support/core_ext/hash.rb
170
+ - lib/active_support/core_ext/hash/compact.rb
171
+ - lib/active_support/core_ext/hash/conversions.rb
172
+ - lib/active_support/core_ext/hash/deep_merge.rb
173
+ - lib/active_support/core_ext/hash/deep_transform_values.rb
174
+ - lib/active_support/core_ext/hash/except.rb
175
+ - lib/active_support/core_ext/hash/indifferent_access.rb
176
+ - lib/active_support/core_ext/hash/keys.rb
177
+ - lib/active_support/core_ext/hash/reverse_merge.rb
178
+ - lib/active_support/core_ext/hash/slice.rb
179
+ - lib/active_support/core_ext/hash/transform_values.rb
180
+ - lib/active_support/core_ext/integer.rb
181
+ - lib/active_support/core_ext/integer/inflections.rb
182
+ - lib/active_support/core_ext/integer/multiple.rb
183
+ - lib/active_support/core_ext/integer/time.rb
184
+ - lib/active_support/core_ext/kernel.rb
185
+ - lib/active_support/core_ext/kernel/concern.rb
186
+ - lib/active_support/core_ext/kernel/reporting.rb
187
+ - lib/active_support/core_ext/kernel/singleton_class.rb
188
+ - lib/active_support/core_ext/load_error.rb
189
+ - lib/active_support/core_ext/marshal.rb
190
+ - lib/active_support/core_ext/module.rb
191
+ - lib/active_support/core_ext/module/aliasing.rb
192
+ - lib/active_support/core_ext/module/anonymous.rb
193
+ - lib/active_support/core_ext/module/attr_internal.rb
194
+ - lib/active_support/core_ext/module/attribute_accessors.rb
195
+ - lib/active_support/core_ext/module/attribute_accessors_per_thread.rb
196
+ - lib/active_support/core_ext/module/concerning.rb
197
+ - lib/active_support/core_ext/module/delegation.rb
198
+ - lib/active_support/core_ext/module/deprecation.rb
199
+ - lib/active_support/core_ext/module/introspection.rb
200
+ - lib/active_support/core_ext/module/reachable.rb
201
+ - lib/active_support/core_ext/module/redefine_method.rb
202
+ - lib/active_support/core_ext/module/remove_method.rb
203
+ - lib/active_support/core_ext/name_error.rb
204
+ - lib/active_support/core_ext/numeric.rb
205
+ - lib/active_support/core_ext/numeric/bytes.rb
206
+ - lib/active_support/core_ext/numeric/conversions.rb
207
+ - lib/active_support/core_ext/numeric/inquiry.rb
208
+ - lib/active_support/core_ext/numeric/time.rb
209
+ - lib/active_support/core_ext/object.rb
210
+ - lib/active_support/core_ext/object/acts_like.rb
211
+ - lib/active_support/core_ext/object/blank.rb
212
+ - lib/active_support/core_ext/object/conversions.rb
213
+ - lib/active_support/core_ext/object/deep_dup.rb
214
+ - lib/active_support/core_ext/object/duplicable.rb
215
+ - lib/active_support/core_ext/object/inclusion.rb
216
+ - lib/active_support/core_ext/object/instance_variables.rb
217
+ - lib/active_support/core_ext/object/json.rb
218
+ - lib/active_support/core_ext/object/to_param.rb
219
+ - lib/active_support/core_ext/object/to_query.rb
220
+ - lib/active_support/core_ext/object/try.rb
221
+ - lib/active_support/core_ext/object/with_options.rb
222
+ - lib/active_support/core_ext/range.rb
223
+ - lib/active_support/core_ext/range/compare_range.rb
224
+ - lib/active_support/core_ext/range/conversions.rb
225
+ - lib/active_support/core_ext/range/each.rb
226
+ - lib/active_support/core_ext/range/include_range.rb
227
+ - lib/active_support/core_ext/range/include_time_with_zone.rb
228
+ - lib/active_support/core_ext/range/overlaps.rb
229
+ - lib/active_support/core_ext/regexp.rb
230
+ - lib/active_support/core_ext/securerandom.rb
231
+ - lib/active_support/core_ext/string.rb
232
+ - lib/active_support/core_ext/string/access.rb
233
+ - lib/active_support/core_ext/string/behavior.rb
234
+ - lib/active_support/core_ext/string/conversions.rb
235
+ - lib/active_support/core_ext/string/exclude.rb
236
+ - lib/active_support/core_ext/string/filters.rb
237
+ - lib/active_support/core_ext/string/indent.rb
238
+ - lib/active_support/core_ext/string/inflections.rb
239
+ - lib/active_support/core_ext/string/inquiry.rb
240
+ - lib/active_support/core_ext/string/multibyte.rb
241
+ - lib/active_support/core_ext/string/output_safety.rb
242
+ - lib/active_support/core_ext/string/starts_ends_with.rb
243
+ - lib/active_support/core_ext/string/strip.rb
244
+ - lib/active_support/core_ext/string/zones.rb
245
+ - lib/active_support/core_ext/time.rb
246
+ - lib/active_support/core_ext/time/acts_like.rb
247
+ - lib/active_support/core_ext/time/calculations.rb
248
+ - lib/active_support/core_ext/time/compatibility.rb
249
+ - lib/active_support/core_ext/time/conversions.rb
250
+ - lib/active_support/core_ext/time/zones.rb
251
+ - lib/active_support/core_ext/uri.rb
252
+ - lib/active_support/current_attributes.rb
253
+ - lib/active_support/dependencies.rb
254
+ - lib/active_support/dependencies/autoload.rb
255
+ - lib/active_support/dependencies/interlock.rb
256
+ - lib/active_support/dependencies/zeitwerk_integration.rb
257
+ - lib/active_support/deprecation.rb
258
+ - lib/active_support/deprecation/behaviors.rb
259
+ - lib/active_support/deprecation/constant_accessor.rb
260
+ - lib/active_support/deprecation/instance_delegator.rb
261
+ - lib/active_support/deprecation/method_wrappers.rb
262
+ - lib/active_support/deprecation/proxy_wrappers.rb
263
+ - lib/active_support/deprecation/reporting.rb
264
+ - lib/active_support/descendants_tracker.rb
265
+ - lib/active_support/digest.rb
266
+ - lib/active_support/duration.rb
267
+ - lib/active_support/duration/iso8601_parser.rb
268
+ - lib/active_support/duration/iso8601_serializer.rb
269
+ - lib/active_support/encrypted_configuration.rb
270
+ - lib/active_support/encrypted_file.rb
271
+ - lib/active_support/evented_file_update_checker.rb
272
+ - lib/active_support/execution_wrapper.rb
273
+ - lib/active_support/executor.rb
274
+ - lib/active_support/file_update_checker.rb
275
+ - lib/active_support/gem_version.rb
276
+ - lib/active_support/gzip.rb
277
+ - lib/active_support/hash_with_indifferent_access.rb
278
+ - lib/active_support/i18n.rb
279
+ - lib/active_support/i18n_railtie.rb
280
+ - lib/active_support/inflections.rb
281
+ - lib/active_support/inflector.rb
282
+ - lib/active_support/inflector/inflections.rb
283
+ - lib/active_support/inflector/methods.rb
284
+ - lib/active_support/inflector/transliterate.rb
285
+ - lib/active_support/json.rb
286
+ - lib/active_support/json/decoding.rb
287
+ - lib/active_support/json/encoding.rb
288
+ - lib/active_support/key_generator.rb
289
+ - lib/active_support/lazy_load_hooks.rb
290
+ - lib/active_support/locale/en.rb
291
+ - lib/active_support/locale/en.yml
292
+ - lib/active_support/log_subscriber.rb
293
+ - lib/active_support/log_subscriber/test_helper.rb
294
+ - lib/active_support/logger.rb
295
+ - lib/active_support/logger_silence.rb
296
+ - lib/active_support/logger_thread_safe_level.rb
297
+ - lib/active_support/message_encryptor.rb
298
+ - lib/active_support/message_verifier.rb
299
+ - lib/active_support/messages/metadata.rb
300
+ - lib/active_support/messages/rotation_configuration.rb
301
+ - lib/active_support/messages/rotator.rb
302
+ - lib/active_support/multibyte.rb
303
+ - lib/active_support/multibyte/chars.rb
304
+ - lib/active_support/multibyte/unicode.rb
305
+ - lib/active_support/notifications.rb
306
+ - lib/active_support/notifications/fanout.rb
307
+ - lib/active_support/notifications/instrumenter.rb
308
+ - lib/active_support/number_helper.rb
309
+ - lib/active_support/number_helper/number_converter.rb
310
+ - lib/active_support/number_helper/number_to_currency_converter.rb
311
+ - lib/active_support/number_helper/number_to_delimited_converter.rb
312
+ - lib/active_support/number_helper/number_to_human_converter.rb
313
+ - lib/active_support/number_helper/number_to_human_size_converter.rb
314
+ - lib/active_support/number_helper/number_to_percentage_converter.rb
315
+ - lib/active_support/number_helper/number_to_phone_converter.rb
316
+ - lib/active_support/number_helper/number_to_rounded_converter.rb
317
+ - lib/active_support/number_helper/rounding_helper.rb
318
+ - lib/active_support/option_merger.rb
319
+ - lib/active_support/ordered_hash.rb
320
+ - lib/active_support/ordered_options.rb
321
+ - lib/active_support/parameter_filter.rb
322
+ - lib/active_support/per_thread_registry.rb
323
+ - lib/active_support/proxy_object.rb
324
+ - lib/active_support/rails.rb
325
+ - lib/active_support/railtie.rb
326
+ - lib/active_support/reloader.rb
327
+ - lib/active_support/rescuable.rb
328
+ - lib/active_support/security_utils.rb
329
+ - lib/active_support/string_inquirer.rb
330
+ - lib/active_support/subscriber.rb
331
+ - lib/active_support/tagged_logging.rb
332
+ - lib/active_support/test_case.rb
333
+ - lib/active_support/testing/assertions.rb
334
+ - lib/active_support/testing/autorun.rb
335
+ - lib/active_support/testing/constant_lookup.rb
336
+ - lib/active_support/testing/declarative.rb
337
+ - lib/active_support/testing/deprecation.rb
338
+ - lib/active_support/testing/file_fixtures.rb
339
+ - lib/active_support/testing/isolation.rb
340
+ - lib/active_support/testing/method_call_assertions.rb
341
+ - lib/active_support/testing/parallelization.rb
342
+ - lib/active_support/testing/setup_and_teardown.rb
343
+ - lib/active_support/testing/stream.rb
344
+ - lib/active_support/testing/tagged_logging.rb
345
+ - lib/active_support/testing/time_helpers.rb
346
+ - lib/active_support/time.rb
347
+ - lib/active_support/time_with_zone.rb
348
+ - lib/active_support/values/time_zone.rb
349
+ - lib/active_support/version.rb
350
+ - lib/active_support/xml_mini.rb
351
+ - lib/active_support/xml_mini/jdom.rb
352
+ - lib/active_support/xml_mini/libxml.rb
353
+ - lib/active_support/xml_mini/libxmlsax.rb
354
+ - lib/active_support/xml_mini/nokogiri.rb
355
+ - lib/active_support/xml_mini/nokogirisax.rb
356
+ - lib/active_support/xml_mini/rexml.rb
357
+ homepage: https://rubyonrails.org
358
+ licenses:
359
+ - MIT
360
+ metadata:
361
+ source_code_uri: https://github.com/rails/rails/tree/v6.0.0/activesupport
362
+ changelog_uri: https://github.com/rails/rails/blob/v6.0.0/activesupport/CHANGELOG.md
363
+ post_install_message:
364
+ rdoc_options:
365
+ - "--encoding"
366
+ - UTF-8
367
+ require_paths:
368
+ - lib
369
+ required_ruby_version: !ruby/object:Gem::Requirement
370
+ requirements:
371
+ - - ">="
372
+ - !ruby/object:Gem::Version
373
+ version: 2.5.0
374
+ required_rubygems_version: !ruby/object:Gem::Requirement
375
+ requirements:
376
+ - - ">="
377
+ - !ruby/object:Gem::Version
378
+ version: '0'
379
+ requirements: []
380
+ rubygems_version: 3.0.1
381
+ signing_key:
382
+ specification_version: 4
383
+ summary: A toolkit of support libraries and Ruby core extensions extracted from the
384
+ Rails framework.
385
+ test_files: []