omg-activesupport 8.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (289) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +86 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +40 -0
  5. data/lib/active_support/actionable_error.rb +50 -0
  6. data/lib/active_support/all.rb +5 -0
  7. data/lib/active_support/array_inquirer.rb +50 -0
  8. data/lib/active_support/backtrace_cleaner.rb +163 -0
  9. data/lib/active_support/benchmark.rb +21 -0
  10. data/lib/active_support/benchmarkable.rb +53 -0
  11. data/lib/active_support/broadcast_logger.rb +251 -0
  12. data/lib/active_support/builder.rb +8 -0
  13. data/lib/active_support/cache/coder.rb +153 -0
  14. data/lib/active_support/cache/entry.rb +134 -0
  15. data/lib/active_support/cache/file_store.rb +244 -0
  16. data/lib/active_support/cache/mem_cache_store.rb +290 -0
  17. data/lib/active_support/cache/memory_store.rb +262 -0
  18. data/lib/active_support/cache/null_store.rb +62 -0
  19. data/lib/active_support/cache/redis_cache_store.rb +492 -0
  20. data/lib/active_support/cache/serializer_with_fallback.rb +152 -0
  21. data/lib/active_support/cache/strategy/local_cache.rb +201 -0
  22. data/lib/active_support/cache/strategy/local_cache_middleware.rb +45 -0
  23. data/lib/active_support/cache.rb +1104 -0
  24. data/lib/active_support/callbacks.rb +944 -0
  25. data/lib/active_support/class_attribute.rb +26 -0
  26. data/lib/active_support/code_generator.rb +79 -0
  27. data/lib/active_support/concern.rb +217 -0
  28. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +72 -0
  29. data/lib/active_support/concurrency/null_lock.rb +13 -0
  30. data/lib/active_support/concurrency/share_lock.rb +225 -0
  31. data/lib/active_support/configurable.rb +159 -0
  32. data/lib/active_support/configuration_file.rb +60 -0
  33. data/lib/active_support/core_ext/array/access.rb +100 -0
  34. data/lib/active_support/core_ext/array/conversions.rb +213 -0
  35. data/lib/active_support/core_ext/array/extract.rb +21 -0
  36. data/lib/active_support/core_ext/array/extract_options.rb +31 -0
  37. data/lib/active_support/core_ext/array/grouping.rb +109 -0
  38. data/lib/active_support/core_ext/array/inquiry.rb +19 -0
  39. data/lib/active_support/core_ext/array/wrap.rb +48 -0
  40. data/lib/active_support/core_ext/array.rb +9 -0
  41. data/lib/active_support/core_ext/benchmark.rb +13 -0
  42. data/lib/active_support/core_ext/big_decimal/conversions.rb +14 -0
  43. data/lib/active_support/core_ext/big_decimal.rb +3 -0
  44. data/lib/active_support/core_ext/class/attribute.rb +122 -0
  45. data/lib/active_support/core_ext/class/attribute_accessors.rb +6 -0
  46. data/lib/active_support/core_ext/class/subclasses.rb +24 -0
  47. data/lib/active_support/core_ext/class.rb +4 -0
  48. data/lib/active_support/core_ext/date/acts_like.rb +10 -0
  49. data/lib/active_support/core_ext/date/blank.rb +18 -0
  50. data/lib/active_support/core_ext/date/calculations.rb +161 -0
  51. data/lib/active_support/core_ext/date/conversions.rb +98 -0
  52. data/lib/active_support/core_ext/date/zones.rb +8 -0
  53. data/lib/active_support/core_ext/date.rb +7 -0
  54. data/lib/active_support/core_ext/date_and_time/calculations.rb +374 -0
  55. data/lib/active_support/core_ext/date_and_time/compatibility.rb +58 -0
  56. data/lib/active_support/core_ext/date_and_time/zones.rb +40 -0
  57. data/lib/active_support/core_ext/date_time/acts_like.rb +16 -0
  58. data/lib/active_support/core_ext/date_time/blank.rb +18 -0
  59. data/lib/active_support/core_ext/date_time/calculations.rb +215 -0
  60. data/lib/active_support/core_ext/date_time/compatibility.rb +18 -0
  61. data/lib/active_support/core_ext/date_time/conversions.rb +106 -0
  62. data/lib/active_support/core_ext/date_time.rb +7 -0
  63. data/lib/active_support/core_ext/digest/uuid.rb +76 -0
  64. data/lib/active_support/core_ext/digest.rb +3 -0
  65. data/lib/active_support/core_ext/enumerable.rb +267 -0
  66. data/lib/active_support/core_ext/erb/util.rb +201 -0
  67. data/lib/active_support/core_ext/file/atomic.rb +72 -0
  68. data/lib/active_support/core_ext/file.rb +3 -0
  69. data/lib/active_support/core_ext/hash/conversions.rb +262 -0
  70. data/lib/active_support/core_ext/hash/deep_merge.rb +42 -0
  71. data/lib/active_support/core_ext/hash/deep_transform_values.rb +46 -0
  72. data/lib/active_support/core_ext/hash/except.rb +12 -0
  73. data/lib/active_support/core_ext/hash/indifferent_access.rb +24 -0
  74. data/lib/active_support/core_ext/hash/keys.rb +143 -0
  75. data/lib/active_support/core_ext/hash/reverse_merge.rb +25 -0
  76. data/lib/active_support/core_ext/hash/slice.rb +27 -0
  77. data/lib/active_support/core_ext/hash.rb +10 -0
  78. data/lib/active_support/core_ext/integer/inflections.rb +31 -0
  79. data/lib/active_support/core_ext/integer/multiple.rb +12 -0
  80. data/lib/active_support/core_ext/integer/time.rb +22 -0
  81. data/lib/active_support/core_ext/integer.rb +5 -0
  82. data/lib/active_support/core_ext/kernel/concern.rb +14 -0
  83. data/lib/active_support/core_ext/kernel/reporting.rb +45 -0
  84. data/lib/active_support/core_ext/kernel/singleton_class.rb +8 -0
  85. data/lib/active_support/core_ext/kernel.rb +5 -0
  86. data/lib/active_support/core_ext/load_error.rb +9 -0
  87. data/lib/active_support/core_ext/module/aliasing.rb +31 -0
  88. data/lib/active_support/core_ext/module/anonymous.rb +30 -0
  89. data/lib/active_support/core_ext/module/attr_internal.rb +49 -0
  90. data/lib/active_support/core_ext/module/attribute_accessors.rb +214 -0
  91. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +175 -0
  92. data/lib/active_support/core_ext/module/concerning.rb +140 -0
  93. data/lib/active_support/core_ext/module/delegation.rb +225 -0
  94. data/lib/active_support/core_ext/module/deprecation.rb +25 -0
  95. data/lib/active_support/core_ext/module/introspection.rb +62 -0
  96. data/lib/active_support/core_ext/module/redefine_method.rb +40 -0
  97. data/lib/active_support/core_ext/module/remove_method.rb +17 -0
  98. data/lib/active_support/core_ext/module.rb +13 -0
  99. data/lib/active_support/core_ext/name_error.rb +59 -0
  100. data/lib/active_support/core_ext/numeric/bytes.rb +75 -0
  101. data/lib/active_support/core_ext/numeric/conversions.rb +145 -0
  102. data/lib/active_support/core_ext/numeric/time.rb +66 -0
  103. data/lib/active_support/core_ext/numeric.rb +5 -0
  104. data/lib/active_support/core_ext/object/acts_like.rb +45 -0
  105. data/lib/active_support/core_ext/object/blank.rb +199 -0
  106. data/lib/active_support/core_ext/object/conversions.rb +6 -0
  107. data/lib/active_support/core_ext/object/deep_dup.rb +71 -0
  108. data/lib/active_support/core_ext/object/duplicable.rb +69 -0
  109. data/lib/active_support/core_ext/object/inclusion.rb +37 -0
  110. data/lib/active_support/core_ext/object/instance_variables.rb +32 -0
  111. data/lib/active_support/core_ext/object/json.rb +260 -0
  112. data/lib/active_support/core_ext/object/to_param.rb +3 -0
  113. data/lib/active_support/core_ext/object/to_query.rb +87 -0
  114. data/lib/active_support/core_ext/object/try.rb +158 -0
  115. data/lib/active_support/core_ext/object/with.rb +46 -0
  116. data/lib/active_support/core_ext/object/with_options.rb +101 -0
  117. data/lib/active_support/core_ext/object.rb +17 -0
  118. data/lib/active_support/core_ext/pathname/blank.rb +20 -0
  119. data/lib/active_support/core_ext/pathname/existence.rb +23 -0
  120. data/lib/active_support/core_ext/pathname.rb +4 -0
  121. data/lib/active_support/core_ext/range/compare_range.rb +57 -0
  122. data/lib/active_support/core_ext/range/conversions.rb +62 -0
  123. data/lib/active_support/core_ext/range/each.rb +24 -0
  124. data/lib/active_support/core_ext/range/overlap.rb +40 -0
  125. data/lib/active_support/core_ext/range.rb +6 -0
  126. data/lib/active_support/core_ext/regexp.rb +14 -0
  127. data/lib/active_support/core_ext/securerandom.rb +41 -0
  128. data/lib/active_support/core_ext/string/access.rb +95 -0
  129. data/lib/active_support/core_ext/string/behavior.rb +8 -0
  130. data/lib/active_support/core_ext/string/conversions.rb +60 -0
  131. data/lib/active_support/core_ext/string/exclude.rb +13 -0
  132. data/lib/active_support/core_ext/string/filters.rb +151 -0
  133. data/lib/active_support/core_ext/string/indent.rb +45 -0
  134. data/lib/active_support/core_ext/string/inflections.rb +300 -0
  135. data/lib/active_support/core_ext/string/inquiry.rb +16 -0
  136. data/lib/active_support/core_ext/string/multibyte.rb +58 -0
  137. data/lib/active_support/core_ext/string/output_safety.rb +228 -0
  138. data/lib/active_support/core_ext/string/starts_ends_with.rb +6 -0
  139. data/lib/active_support/core_ext/string/strip.rb +27 -0
  140. data/lib/active_support/core_ext/string/zones.rb +16 -0
  141. data/lib/active_support/core_ext/string.rb +15 -0
  142. data/lib/active_support/core_ext/symbol/starts_ends_with.rb +6 -0
  143. data/lib/active_support/core_ext/symbol.rb +3 -0
  144. data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
  145. data/lib/active_support/core_ext/time/acts_like.rb +10 -0
  146. data/lib/active_support/core_ext/time/calculations.rb +386 -0
  147. data/lib/active_support/core_ext/time/compatibility.rb +32 -0
  148. data/lib/active_support/core_ext/time/conversions.rb +75 -0
  149. data/lib/active_support/core_ext/time/zones.rb +97 -0
  150. data/lib/active_support/core_ext/time.rb +7 -0
  151. data/lib/active_support/core_ext.rb +5 -0
  152. data/lib/active_support/current_attributes/test_helper.rb +13 -0
  153. data/lib/active_support/current_attributes.rb +233 -0
  154. data/lib/active_support/deep_mergeable.rb +53 -0
  155. data/lib/active_support/delegation.rb +202 -0
  156. data/lib/active_support/dependencies/autoload.rb +72 -0
  157. data/lib/active_support/dependencies/interlock.rb +49 -0
  158. data/lib/active_support/dependencies/require_dependency.rb +28 -0
  159. data/lib/active_support/dependencies.rb +98 -0
  160. data/lib/active_support/deprecation/behaviors.rb +148 -0
  161. data/lib/active_support/deprecation/constant_accessor.rb +74 -0
  162. data/lib/active_support/deprecation/deprecators.rb +104 -0
  163. data/lib/active_support/deprecation/disallowed.rb +54 -0
  164. data/lib/active_support/deprecation/method_wrappers.rb +68 -0
  165. data/lib/active_support/deprecation/proxy_wrappers.rb +189 -0
  166. data/lib/active_support/deprecation/reporting.rb +179 -0
  167. data/lib/active_support/deprecation.rb +81 -0
  168. data/lib/active_support/deprecator.rb +7 -0
  169. data/lib/active_support/descendants_tracker.rb +112 -0
  170. data/lib/active_support/digest.rb +22 -0
  171. data/lib/active_support/duration/iso8601_parser.rb +123 -0
  172. data/lib/active_support/duration/iso8601_serializer.rb +64 -0
  173. data/lib/active_support/duration.rb +520 -0
  174. data/lib/active_support/encrypted_configuration.rb +126 -0
  175. data/lib/active_support/encrypted_file.rb +133 -0
  176. data/lib/active_support/environment_inquirer.rb +40 -0
  177. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  178. data/lib/active_support/error_reporter.rb +265 -0
  179. data/lib/active_support/evented_file_update_checker.rb +182 -0
  180. data/lib/active_support/execution_context/test_helper.rb +13 -0
  181. data/lib/active_support/execution_context.rb +53 -0
  182. data/lib/active_support/execution_wrapper.rb +150 -0
  183. data/lib/active_support/executor/test_helper.rb +7 -0
  184. data/lib/active_support/executor.rb +8 -0
  185. data/lib/active_support/file_update_checker.rb +164 -0
  186. data/lib/active_support/fork_tracker.rb +43 -0
  187. data/lib/active_support/gem_version.rb +17 -0
  188. data/lib/active_support/gzip.rb +40 -0
  189. data/lib/active_support/hash_with_indifferent_access.rb +445 -0
  190. data/lib/active_support/html_safe_translation.rb +56 -0
  191. data/lib/active_support/i18n.rb +17 -0
  192. data/lib/active_support/i18n_railtie.rb +138 -0
  193. data/lib/active_support/inflections.rb +72 -0
  194. data/lib/active_support/inflector/inflections.rb +273 -0
  195. data/lib/active_support/inflector/methods.rb +387 -0
  196. data/lib/active_support/inflector/transliterate.rb +149 -0
  197. data/lib/active_support/inflector.rb +9 -0
  198. data/lib/active_support/isolated_execution_state.rb +75 -0
  199. data/lib/active_support/json/decoding.rb +76 -0
  200. data/lib/active_support/json/encoding.rb +120 -0
  201. data/lib/active_support/json.rb +4 -0
  202. data/lib/active_support/key_generator.rb +66 -0
  203. data/lib/active_support/lazy_load_hooks.rb +107 -0
  204. data/lib/active_support/locale/en.rb +33 -0
  205. data/lib/active_support/locale/en.yml +141 -0
  206. data/lib/active_support/log_subscriber/test_helper.rb +106 -0
  207. data/lib/active_support/log_subscriber.rb +192 -0
  208. data/lib/active_support/logger.rb +55 -0
  209. data/lib/active_support/logger_silence.rb +21 -0
  210. data/lib/active_support/logger_thread_safe_level.rb +47 -0
  211. data/lib/active_support/message_encryptor.rb +374 -0
  212. data/lib/active_support/message_encryptors.rb +141 -0
  213. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  214. data/lib/active_support/message_pack/extensions.rb +305 -0
  215. data/lib/active_support/message_pack/serializer.rb +63 -0
  216. data/lib/active_support/message_pack.rb +50 -0
  217. data/lib/active_support/message_verifier.rb +368 -0
  218. data/lib/active_support/message_verifiers.rb +135 -0
  219. data/lib/active_support/messages/codec.rb +65 -0
  220. data/lib/active_support/messages/metadata.rb +146 -0
  221. data/lib/active_support/messages/rotation_configuration.rb +23 -0
  222. data/lib/active_support/messages/rotation_coordinator.rb +93 -0
  223. data/lib/active_support/messages/rotator.rb +59 -0
  224. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  225. data/lib/active_support/multibyte/chars.rb +178 -0
  226. data/lib/active_support/multibyte/unicode.rb +42 -0
  227. data/lib/active_support/multibyte.rb +23 -0
  228. data/lib/active_support/notifications/fanout.rb +446 -0
  229. data/lib/active_support/notifications/instrumenter.rb +240 -0
  230. data/lib/active_support/notifications.rb +281 -0
  231. data/lib/active_support/number_helper/number_converter.rb +190 -0
  232. data/lib/active_support/number_helper/number_to_currency_converter.rb +46 -0
  233. data/lib/active_support/number_helper/number_to_delimited_converter.rb +30 -0
  234. data/lib/active_support/number_helper/number_to_human_converter.rb +69 -0
  235. data/lib/active_support/number_helper/number_to_human_size_converter.rb +60 -0
  236. data/lib/active_support/number_helper/number_to_percentage_converter.rb +16 -0
  237. data/lib/active_support/number_helper/number_to_phone_converter.rb +60 -0
  238. data/lib/active_support/number_helper/number_to_rounded_converter.rb +59 -0
  239. data/lib/active_support/number_helper/rounding_helper.rb +46 -0
  240. data/lib/active_support/number_helper.rb +479 -0
  241. data/lib/active_support/option_merger.rb +38 -0
  242. data/lib/active_support/ordered_hash.rb +50 -0
  243. data/lib/active_support/ordered_options.rb +147 -0
  244. data/lib/active_support/parameter_filter.rb +157 -0
  245. data/lib/active_support/proxy_object.rb +20 -0
  246. data/lib/active_support/rails.rb +26 -0
  247. data/lib/active_support/railtie.rb +161 -0
  248. data/lib/active_support/reloader.rb +138 -0
  249. data/lib/active_support/rescuable.rb +176 -0
  250. data/lib/active_support/secure_compare_rotator.rb +58 -0
  251. data/lib/active_support/security_utils.rb +38 -0
  252. data/lib/active_support/string_inquirer.rb +35 -0
  253. data/lib/active_support/subscriber.rb +146 -0
  254. data/lib/active_support/syntax_error_proxy.rb +60 -0
  255. data/lib/active_support/tagged_logging.rb +152 -0
  256. data/lib/active_support/test_case.rb +304 -0
  257. data/lib/active_support/testing/assertions.rb +332 -0
  258. data/lib/active_support/testing/autorun.rb +5 -0
  259. data/lib/active_support/testing/constant_lookup.rb +51 -0
  260. data/lib/active_support/testing/constant_stubbing.rb +54 -0
  261. data/lib/active_support/testing/declarative.rb +28 -0
  262. data/lib/active_support/testing/deprecation.rb +82 -0
  263. data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
  264. data/lib/active_support/testing/file_fixtures.rb +38 -0
  265. data/lib/active_support/testing/isolation.rb +121 -0
  266. data/lib/active_support/testing/method_call_assertions.rb +69 -0
  267. data/lib/active_support/testing/parallelization/server.rb +85 -0
  268. data/lib/active_support/testing/parallelization/worker.rb +103 -0
  269. data/lib/active_support/testing/parallelization.rb +55 -0
  270. data/lib/active_support/testing/parallelize_executor.rb +81 -0
  271. data/lib/active_support/testing/setup_and_teardown.rb +57 -0
  272. data/lib/active_support/testing/stream.rb +41 -0
  273. data/lib/active_support/testing/strict_warnings.rb +43 -0
  274. data/lib/active_support/testing/tagged_logging.rb +27 -0
  275. data/lib/active_support/testing/tests_without_assertions.rb +19 -0
  276. data/lib/active_support/testing/time_helpers.rb +269 -0
  277. data/lib/active_support/time.rb +20 -0
  278. data/lib/active_support/time_with_zone.rb +609 -0
  279. data/lib/active_support/values/time_zone.rb +614 -0
  280. data/lib/active_support/version.rb +10 -0
  281. data/lib/active_support/xml_mini/jdom.rb +175 -0
  282. data/lib/active_support/xml_mini/libxml.rb +80 -0
  283. data/lib/active_support/xml_mini/libxmlsax.rb +83 -0
  284. data/lib/active_support/xml_mini/nokogiri.rb +83 -0
  285. data/lib/active_support/xml_mini/nokogirisax.rb +86 -0
  286. data/lib/active_support/xml_mini/rexml.rb +137 -0
  287. data/lib/active_support/xml_mini.rb +211 -0
  288. data/lib/active_support.rb +144 -0
  289. metadata +526 -0
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/concern"
4
+ require "active_support/ordered_options"
5
+
6
+ module ActiveSupport
7
+ # = Active Support \Configurable
8
+ #
9
+ # Configurable provides a <tt>config</tt> method to store and retrieve
10
+ # configuration options as an OrderedOptions.
11
+ module Configurable
12
+ extend ActiveSupport::Concern
13
+
14
+ class Configuration < ActiveSupport::InheritableOptions
15
+ def compile_methods!
16
+ self.class.compile_methods!(keys)
17
+ end
18
+
19
+ # Compiles reader methods so we don't have to go through method_missing.
20
+ def self.compile_methods!(keys)
21
+ keys.reject { |m| method_defined?(m) }.each do |key|
22
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
23
+ def #{key}; _get(#{key.inspect}); end
24
+ RUBY
25
+ end
26
+ end
27
+ end
28
+
29
+ module ClassMethods
30
+ def config
31
+ @_config ||= if respond_to?(:superclass) && superclass.respond_to?(:config)
32
+ superclass.config.inheritable_copy
33
+ else
34
+ # create a new "anonymous" class that will host the compiled reader methods
35
+ Class.new(Configuration).new
36
+ end
37
+ end
38
+
39
+ def configure
40
+ yield config
41
+ end
42
+
43
+ # Allows you to add shortcut so that you don't have to refer to attribute
44
+ # through config. Also look at the example for config to contrast.
45
+ #
46
+ # Defines both class and instance config accessors.
47
+ #
48
+ # class User
49
+ # include ActiveSupport::Configurable
50
+ # config_accessor :allowed_access
51
+ # end
52
+ #
53
+ # User.allowed_access # => nil
54
+ # User.allowed_access = false
55
+ # User.allowed_access # => false
56
+ #
57
+ # user = User.new
58
+ # user.allowed_access # => false
59
+ # user.allowed_access = true
60
+ # user.allowed_access # => true
61
+ #
62
+ # User.allowed_access # => false
63
+ #
64
+ # The attribute name must be a valid method name in Ruby.
65
+ #
66
+ # class User
67
+ # include ActiveSupport::Configurable
68
+ # config_accessor :"1_Badname"
69
+ # end
70
+ # # => NameError: invalid config attribute name
71
+ #
72
+ # To omit the instance writer method, pass <tt>instance_writer: false</tt>.
73
+ # To omit the instance reader method, pass <tt>instance_reader: false</tt>.
74
+ #
75
+ # class User
76
+ # include ActiveSupport::Configurable
77
+ # config_accessor :allowed_access, instance_reader: false, instance_writer: false
78
+ # end
79
+ #
80
+ # User.allowed_access = false
81
+ # User.allowed_access # => false
82
+ #
83
+ # User.new.allowed_access = true # => NoMethodError
84
+ # User.new.allowed_access # => NoMethodError
85
+ #
86
+ # Or pass <tt>instance_accessor: false</tt>, to omit both instance methods.
87
+ #
88
+ # class User
89
+ # include ActiveSupport::Configurable
90
+ # config_accessor :allowed_access, instance_accessor: false
91
+ # end
92
+ #
93
+ # User.allowed_access = false
94
+ # User.allowed_access # => false
95
+ #
96
+ # User.new.allowed_access = true # => NoMethodError
97
+ # User.new.allowed_access # => NoMethodError
98
+ #
99
+ # Also you can pass <tt>default</tt> or a block to set up the attribute with a default value.
100
+ #
101
+ # class User
102
+ # include ActiveSupport::Configurable
103
+ # config_accessor :allowed_access, default: false
104
+ # config_accessor :hair_colors do
105
+ # [:brown, :black, :blonde, :red]
106
+ # end
107
+ # end
108
+ #
109
+ # User.allowed_access # => false
110
+ # User.hair_colors # => [:brown, :black, :blonde, :red]
111
+ def config_accessor(*names, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil) # :doc:
112
+ names.each do |name|
113
+ raise NameError.new("invalid config attribute name") unless /\A[_A-Za-z]\w*\z/.match?(name)
114
+
115
+ reader, reader_line = "def #{name}; config.#{name}; end", __LINE__
116
+ writer, writer_line = "def #{name}=(value); config.#{name} = value; end", __LINE__
117
+
118
+ singleton_class.class_eval reader, __FILE__, reader_line
119
+ singleton_class.class_eval writer, __FILE__, writer_line
120
+
121
+ if instance_accessor
122
+ class_eval reader, __FILE__, reader_line if instance_reader
123
+ class_eval writer, __FILE__, writer_line if instance_writer
124
+ end
125
+
126
+ send("#{name}=", block_given? ? yield : default)
127
+ end
128
+ end
129
+ private :config_accessor
130
+
131
+ private
132
+ def inherited(subclass)
133
+ super
134
+ subclass.class_eval do
135
+ @_config = nil
136
+ end
137
+ end
138
+ end
139
+
140
+ # Reads and writes attributes from a configuration OrderedOptions.
141
+ #
142
+ # require "active_support/configurable"
143
+ #
144
+ # class User
145
+ # include ActiveSupport::Configurable
146
+ # end
147
+ #
148
+ # user = User.new
149
+ #
150
+ # user.config.allowed_access = true
151
+ # user.config.level = 1
152
+ #
153
+ # user.config.allowed_access # => true
154
+ # user.config.level # => 1
155
+ def config
156
+ @_config ||= self.class.config.inheritable_copy
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveSupport
4
+ # Reads a YAML configuration file, evaluating any ERB, then
5
+ # parsing the resulting YAML.
6
+ #
7
+ # Warns in case of YAML confusing characters, like invisible
8
+ # non-breaking spaces.
9
+ class ConfigurationFile # :nodoc:
10
+ class FormatError < StandardError; end
11
+
12
+ def initialize(content_path)
13
+ @content_path = content_path.to_s
14
+ @content = read content_path
15
+ end
16
+
17
+ def self.parse(content_path, **options)
18
+ new(content_path).parse(**options)
19
+ end
20
+
21
+ def parse(context: nil, **options)
22
+ source = @content.include?("<%") ? render(context) : @content
23
+
24
+ if source == @content
25
+ if YAML.respond_to?(:unsafe_load)
26
+ YAML.unsafe_load_file(@content_path, **options) || {}
27
+ else
28
+ YAML.load_file(@content_path, **options) || {}
29
+ end
30
+ else
31
+ if YAML.respond_to?(:unsafe_load)
32
+ YAML.unsafe_load(source, **options) || {}
33
+ else
34
+ YAML.load(source, **options) || {}
35
+ end
36
+ end
37
+ rescue Psych::SyntaxError => error
38
+ raise "YAML syntax error occurred while parsing #{@content_path}. " \
39
+ "Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \
40
+ "Error: #{error.message}"
41
+ end
42
+
43
+ private
44
+ def read(content_path)
45
+ require "yaml" unless defined?(YAML)
46
+
47
+ File.read(content_path).tap do |content|
48
+ if content.include?("\u00A0")
49
+ warn "#{content_path} contains invisible non-breaking spaces, you may want to remove those"
50
+ end
51
+ end
52
+ end
53
+
54
+ def render(context)
55
+ require "erb" unless defined?(ERB)
56
+ erb = ERB.new(@content).tap { |e| e.filename = @content_path }
57
+ context ? erb.result(context) : erb.result
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Array
4
+ # Returns the tail of the array from +position+.
5
+ #
6
+ # %w( a b c d ).from(0) # => ["a", "b", "c", "d"]
7
+ # %w( a b c d ).from(2) # => ["c", "d"]
8
+ # %w( a b c d ).from(10) # => []
9
+ # %w().from(0) # => []
10
+ # %w( a b c d ).from(-2) # => ["c", "d"]
11
+ # %w( a b c ).from(-10) # => []
12
+ def from(position)
13
+ self[position, length] || []
14
+ end
15
+
16
+ # Returns the beginning of the array up to +position+.
17
+ #
18
+ # %w( a b c d ).to(0) # => ["a"]
19
+ # %w( a b c d ).to(2) # => ["a", "b", "c"]
20
+ # %w( a b c d ).to(10) # => ["a", "b", "c", "d"]
21
+ # %w().to(0) # => []
22
+ # %w( a b c d ).to(-2) # => ["a", "b", "c"]
23
+ # %w( a b c ).to(-10) # => []
24
+ def to(position)
25
+ if position >= 0
26
+ take position + 1
27
+ else
28
+ self[0..position]
29
+ end
30
+ end
31
+
32
+ # Returns a new array that includes the passed elements.
33
+ #
34
+ # [ 1, 2, 3 ].including(4, 5) # => [ 1, 2, 3, 4, 5 ]
35
+ # [ [ 0, 1 ] ].including([ [ 1, 0 ] ]) # => [ [ 0, 1 ], [ 1, 0 ] ]
36
+ def including(*elements)
37
+ self + elements.flatten(1)
38
+ end
39
+
40
+ # Returns a copy of the Array excluding the specified elements.
41
+ #
42
+ # ["David", "Rafael", "Aaron", "Todd"].excluding("Aaron", "Todd") # => ["David", "Rafael"]
43
+ # [ [ 0, 1 ], [ 1, 0 ] ].excluding([ [ 1, 0 ] ]) # => [ [ 0, 1 ] ]
44
+ #
45
+ # Note: This is an optimization of <tt>Enumerable#excluding</tt> that uses <tt>Array#-</tt>
46
+ # instead of <tt>Array#reject</tt> for performance reasons.
47
+ def excluding(*elements)
48
+ self - elements.flatten(1)
49
+ end
50
+ alias :without :excluding
51
+
52
+ # Equal to <tt>self[1]</tt>.
53
+ #
54
+ # %w( a b c d e ).second # => "b"
55
+ def second
56
+ self[1]
57
+ end
58
+
59
+ # Equal to <tt>self[2]</tt>.
60
+ #
61
+ # %w( a b c d e ).third # => "c"
62
+ def third
63
+ self[2]
64
+ end
65
+
66
+ # Equal to <tt>self[3]</tt>.
67
+ #
68
+ # %w( a b c d e ).fourth # => "d"
69
+ def fourth
70
+ self[3]
71
+ end
72
+
73
+ # Equal to <tt>self[4]</tt>.
74
+ #
75
+ # %w( a b c d e ).fifth # => "e"
76
+ def fifth
77
+ self[4]
78
+ end
79
+
80
+ # Equal to <tt>self[41]</tt>. Also known as accessing "the reddit".
81
+ #
82
+ # (1..42).to_a.forty_two # => 42
83
+ def forty_two
84
+ self[41]
85
+ end
86
+
87
+ # Equal to <tt>self[-3]</tt>.
88
+ #
89
+ # %w( a b c d e ).third_to_last # => "c"
90
+ def third_to_last
91
+ self[-3]
92
+ end
93
+
94
+ # Equal to <tt>self[-2]</tt>.
95
+ #
96
+ # %w( a b c d e ).second_to_last # => "d"
97
+ def second_to_last
98
+ self[-2]
99
+ end
100
+ end
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/hash/keys"
4
+ require "active_support/core_ext/string/inflections"
5
+ require "active_support/core_ext/object/to_param"
6
+ require "active_support/core_ext/object/to_query"
7
+
8
+ class Array
9
+ # Converts the array to a comma-separated sentence where the last element is
10
+ # joined by the connector word.
11
+ #
12
+ # You can pass the following options to change the default behavior. If you
13
+ # pass an option key that doesn't exist in the list below, it will raise an
14
+ # <tt>ArgumentError</tt>.
15
+ #
16
+ # ==== Options
17
+ #
18
+ # * <tt>:words_connector</tt> - The sign or word used to join all but the last
19
+ # element in arrays with three or more elements (default: ", ").
20
+ # * <tt>:last_word_connector</tt> - The sign or word used to join the last element
21
+ # in arrays with three or more elements (default: ", and ").
22
+ # * <tt>:two_words_connector</tt> - The sign or word used to join the elements
23
+ # in arrays with two elements (default: " and ").
24
+ # * <tt>:locale</tt> - If +i18n+ is available, you can set a locale and use
25
+ # the connector options defined on the 'support.array' namespace in the
26
+ # corresponding dictionary file.
27
+ #
28
+ # ==== Examples
29
+ #
30
+ # [].to_sentence # => ""
31
+ # ['one'].to_sentence # => "one"
32
+ # ['one', 'two'].to_sentence # => "one and two"
33
+ # ['one', 'two', 'three'].to_sentence # => "one, two, and three"
34
+ #
35
+ # ['one', 'two'].to_sentence(passing: 'invalid option')
36
+ # # => ArgumentError: Unknown key: :passing. Valid keys are: :words_connector, :two_words_connector, :last_word_connector, :locale
37
+ #
38
+ # ['one', 'two'].to_sentence(two_words_connector: '-')
39
+ # # => "one-two"
40
+ #
41
+ # ['one', 'two', 'three'].to_sentence(words_connector: ' or ', last_word_connector: ' or at least ')
42
+ # # => "one or two or at least three"
43
+ #
44
+ # Using <tt>:locale</tt> option:
45
+ #
46
+ # # Given this locale dictionary:
47
+ # #
48
+ # # es:
49
+ # # support:
50
+ # # array:
51
+ # # words_connector: " o "
52
+ # # two_words_connector: " y "
53
+ # # last_word_connector: " o al menos "
54
+ #
55
+ # ['uno', 'dos'].to_sentence(locale: :es)
56
+ # # => "uno y dos"
57
+ #
58
+ # ['uno', 'dos', 'tres'].to_sentence(locale: :es)
59
+ # # => "uno o dos o al menos tres"
60
+ def to_sentence(options = {})
61
+ options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale)
62
+
63
+ default_connectors = {
64
+ words_connector: ", ",
65
+ two_words_connector: " and ",
66
+ last_word_connector: ", and "
67
+ }
68
+ if options[:locale] != false && defined?(I18n)
69
+ i18n_connectors = I18n.translate(:'support.array', locale: options[:locale], default: {})
70
+ default_connectors.merge!(i18n_connectors)
71
+ end
72
+ options = default_connectors.merge!(options)
73
+
74
+ case length
75
+ when 0
76
+ +""
77
+ when 1
78
+ +"#{self[0]}"
79
+ when 2
80
+ +"#{self[0]}#{options[:two_words_connector]}#{self[1]}"
81
+ else
82
+ +"#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}"
83
+ end
84
+ end
85
+
86
+ # Extends <tt>Array#to_s</tt> to convert a collection of elements into a
87
+ # comma separated id list if <tt>:db</tt> argument is given as the format.
88
+ #
89
+ # This method is aliased to <tt>to_formatted_s</tt>.
90
+ #
91
+ # Blog.all.to_fs(:db) # => "1,2,3"
92
+ # Blog.none.to_fs(:db) # => "null"
93
+ # [1,2].to_fs # => "[1, 2]"
94
+ def to_fs(format = :default)
95
+ case format
96
+ when :db
97
+ if empty?
98
+ "null"
99
+ else
100
+ collect(&:id).join(",")
101
+ end
102
+ else
103
+ to_s
104
+ end
105
+ end
106
+ alias_method :to_formatted_s, :to_fs
107
+
108
+ # Returns a string that represents the array in XML by invoking +to_xml+
109
+ # on each element. Active Record collections delegate their representation
110
+ # in XML to this method.
111
+ #
112
+ # All elements are expected to respond to +to_xml+, if any of them does
113
+ # not then an exception is raised.
114
+ #
115
+ # The root node reflects the class name of the first element in plural
116
+ # if all elements belong to the same type and that's not Hash:
117
+ #
118
+ # customer.projects.to_xml
119
+ #
120
+ # <?xml version="1.0" encoding="UTF-8"?>
121
+ # <projects type="array">
122
+ # <project>
123
+ # <amount type="decimal">20000.0</amount>
124
+ # <customer-id type="integer">1567</customer-id>
125
+ # <deal-date type="date">2008-04-09</deal-date>
126
+ # ...
127
+ # </project>
128
+ # <project>
129
+ # <amount type="decimal">57230.0</amount>
130
+ # <customer-id type="integer">1567</customer-id>
131
+ # <deal-date type="date">2008-04-15</deal-date>
132
+ # ...
133
+ # </project>
134
+ # </projects>
135
+ #
136
+ # Otherwise the root element is "objects":
137
+ #
138
+ # [{ foo: 1, bar: 2}, { baz: 3}].to_xml
139
+ #
140
+ # <?xml version="1.0" encoding="UTF-8"?>
141
+ # <objects type="array">
142
+ # <object>
143
+ # <bar type="integer">2</bar>
144
+ # <foo type="integer">1</foo>
145
+ # </object>
146
+ # <object>
147
+ # <baz type="integer">3</baz>
148
+ # </object>
149
+ # </objects>
150
+ #
151
+ # If the collection is empty the root element is "nil-classes" by default:
152
+ #
153
+ # [].to_xml
154
+ #
155
+ # <?xml version="1.0" encoding="UTF-8"?>
156
+ # <nil-classes type="array"/>
157
+ #
158
+ # To ensure a meaningful root element use the <tt>:root</tt> option:
159
+ #
160
+ # customer_with_no_projects.projects.to_xml(root: 'projects')
161
+ #
162
+ # <?xml version="1.0" encoding="UTF-8"?>
163
+ # <projects type="array"/>
164
+ #
165
+ # By default name of the node for the children of root is <tt>root.singularize</tt>.
166
+ # You can change it with the <tt>:children</tt> option.
167
+ #
168
+ # The +options+ hash is passed downwards:
169
+ #
170
+ # Message.all.to_xml(skip_types: true)
171
+ #
172
+ # <?xml version="1.0" encoding="UTF-8"?>
173
+ # <messages>
174
+ # <message>
175
+ # <created-at>2008-03-07T09:58:18+01:00</created-at>
176
+ # <id>1</id>
177
+ # <name>1</name>
178
+ # <updated-at>2008-03-07T09:58:18+01:00</updated-at>
179
+ # <user-id>1</user-id>
180
+ # </message>
181
+ # </messages>
182
+ #
183
+ def to_xml(options = {})
184
+ require "active_support/builder" unless defined?(Builder::XmlMarkup)
185
+
186
+ options = options.dup
187
+ options[:indent] ||= 2
188
+ options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent])
189
+ options[:root] ||= \
190
+ if first.class != Hash && all?(first.class)
191
+ underscored = ActiveSupport::Inflector.underscore(first.class.name)
192
+ ActiveSupport::Inflector.pluralize(underscored).tr("/", "_")
193
+ else
194
+ "objects"
195
+ end
196
+
197
+ builder = options[:builder]
198
+ builder.instruct! unless options.delete(:skip_instruct)
199
+
200
+ root = ActiveSupport::XmlMini.rename_key(options[:root].to_s, options)
201
+ children = options.delete(:children) || root.singularize
202
+ attributes = options[:skip_types] ? {} : { type: "array" }
203
+
204
+ if empty?
205
+ builder.tag!(root, attributes)
206
+ else
207
+ builder.tag!(root, attributes) do
208
+ each { |value| ActiveSupport::XmlMini.to_tag(children, value, options) }
209
+ yield builder if block_given?
210
+ end
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Array
4
+ # Removes and returns the elements for which the block returns a true value.
5
+ # If no block is given, an Enumerator is returned instead.
6
+ #
7
+ # numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8
+ # odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
9
+ # numbers # => [0, 2, 4, 6, 8]
10
+ def extract!
11
+ return to_enum(:extract!) { size } unless block_given?
12
+
13
+ extracted_elements = []
14
+
15
+ reject! do |element|
16
+ extracted_elements << element if yield(element)
17
+ end
18
+
19
+ extracted_elements
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Hash
4
+ # By default, only instances of Hash itself are extractable.
5
+ # Subclasses of Hash may implement this method and return
6
+ # true to declare themselves as extractable. If a Hash
7
+ # is extractable, Array#extract_options! pops it from
8
+ # the Array when it is the last element of the Array.
9
+ def extractable_options?
10
+ instance_of?(Hash)
11
+ end
12
+ end
13
+
14
+ class Array
15
+ # Extracts options from a set of arguments. Removes and returns the last
16
+ # element in the array if it's a hash, otherwise returns a blank hash.
17
+ #
18
+ # def options(*args)
19
+ # args.extract_options!
20
+ # end
21
+ #
22
+ # options(1, 2) # => {}
23
+ # options(1, 2, a: :b) # => {:a=>:b}
24
+ def extract_options!
25
+ if last.is_a?(Hash) && last.extractable_options?
26
+ pop
27
+ else
28
+ {}
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Array
4
+ # Splits or iterates over the array in groups of size +number+,
5
+ # padding any remaining slots with +fill_with+ unless it is +false+.
6
+ #
7
+ # %w(1 2 3 4 5 6 7 8 9 10).in_groups_of(3) {|group| p group}
8
+ # ["1", "2", "3"]
9
+ # ["4", "5", "6"]
10
+ # ["7", "8", "9"]
11
+ # ["10", nil, nil]
12
+ #
13
+ # %w(1 2 3 4 5).in_groups_of(2, '&nbsp;') {|group| p group}
14
+ # ["1", "2"]
15
+ # ["3", "4"]
16
+ # ["5", "&nbsp;"]
17
+ #
18
+ # %w(1 2 3 4 5).in_groups_of(2, false) {|group| p group}
19
+ # ["1", "2"]
20
+ # ["3", "4"]
21
+ # ["5"]
22
+ def in_groups_of(number, fill_with = nil, &block)
23
+ if number.to_i <= 0
24
+ raise ArgumentError,
25
+ "Group size must be a positive integer, was #{number.inspect}"
26
+ end
27
+
28
+ if fill_with == false
29
+ collection = self
30
+ else
31
+ # size % number gives how many extra we have;
32
+ # subtracting from number gives how many to add;
33
+ # modulo number ensures we don't add group of just fill.
34
+ padding = (number - size % number) % number
35
+ collection = dup.concat(Array.new(padding, fill_with))
36
+ end
37
+
38
+ if block_given?
39
+ collection.each_slice(number, &block)
40
+ else
41
+ collection.each_slice(number).to_a
42
+ end
43
+ end
44
+
45
+ # Splits or iterates over the array in +number+ of groups, padding any
46
+ # remaining slots with +fill_with+ unless it is +false+.
47
+ #
48
+ # %w(1 2 3 4 5 6 7 8 9 10).in_groups(3) {|group| p group}
49
+ # ["1", "2", "3", "4"]
50
+ # ["5", "6", "7", nil]
51
+ # ["8", "9", "10", nil]
52
+ #
53
+ # %w(1 2 3 4 5 6 7 8 9 10).in_groups(3, '&nbsp;') {|group| p group}
54
+ # ["1", "2", "3", "4"]
55
+ # ["5", "6", "7", "&nbsp;"]
56
+ # ["8", "9", "10", "&nbsp;"]
57
+ #
58
+ # %w(1 2 3 4 5 6 7).in_groups(3, false) {|group| p group}
59
+ # ["1", "2", "3"]
60
+ # ["4", "5"]
61
+ # ["6", "7"]
62
+ def in_groups(number, fill_with = nil, &block)
63
+ # size.div number gives minor group size;
64
+ # size % number gives how many objects need extra accommodation;
65
+ # each group hold either division or division + 1 items.
66
+ division = size.div number
67
+ modulo = size % number
68
+
69
+ # create a new array avoiding dup
70
+ groups = []
71
+ start = 0
72
+
73
+ number.times do |index|
74
+ length = division + (modulo > 0 && modulo > index ? 1 : 0)
75
+ groups << last_group = slice(start, length)
76
+ last_group << fill_with if fill_with != false &&
77
+ modulo > 0 && length == division
78
+ start += length
79
+ end
80
+
81
+ if block_given?
82
+ groups.each(&block)
83
+ else
84
+ groups
85
+ end
86
+ end
87
+
88
+ # Divides the array into one or more subarrays based on a delimiting +value+
89
+ # or the result of an optional block.
90
+ #
91
+ # [1, 2, 3, 4, 5].split(3) # => [[1, 2], [4, 5]]
92
+ # (1..10).to_a.split { |i| i % 3 == 0 } # => [[1, 2], [4, 5], [7, 8], [10]]
93
+ def split(value = nil, &block)
94
+ arr = dup
95
+ result = []
96
+ if block_given?
97
+ while (idx = arr.index(&block))
98
+ result << arr.shift(idx)
99
+ arr.shift
100
+ end
101
+ else
102
+ while (idx = arr.index(value))
103
+ result << arr.shift(idx)
104
+ arr.shift
105
+ end
106
+ end
107
+ result << arr
108
+ end
109
+ end