acfs 2.0.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/README.md +1 -1
  4. data/acfs.gemspec +3 -1
  5. data/lib/acfs/global.rb +10 -6
  6. data/lib/acfs/location.rb +2 -2
  7. data/lib/acfs/middleware/json.rb +3 -3
  8. data/lib/acfs/request.rb +5 -3
  9. data/lib/acfs/resource/attributes.rb +1 -1
  10. data/lib/acfs/runner.rb +46 -8
  11. data/lib/acfs/stub.rb +1 -1
  12. data/lib/acfs/telemetry.rb +19 -0
  13. data/lib/acfs/version.rb +2 -2
  14. data/lib/acfs.rb +7 -4
  15. data/spec/acfs/collection_spec.rb +16 -10
  16. data/spec/acfs/global_spec.rb +2 -2
  17. data/spec/acfs/middleware/json_spec.rb +16 -0
  18. data/spec/acfs/operation_spec.rb +2 -2
  19. data/spec/acfs/request/callbacks_spec.rb +2 -2
  20. data/spec/acfs/resource/locatable_spec.rb +5 -11
  21. data/spec/acfs/resource/query_methods_spec.rb +1 -1
  22. data/spec/acfs/resource/validation_spec.rb +3 -4
  23. data/spec/acfs/runner_spec.rb +6 -6
  24. data/spec/acfs/stub_spec.rb +6 -4
  25. data/spec/acfs_spec.rb +4 -4
  26. data/vendor/bundle/ruby/4.0.0/bundler/gems/rubocop-config-2b861962124a/README.md +23 -0
  27. data/vendor/bundle/ruby/{3.4.0/bundler/gems/rubocop-config-67802c9d1826 → 4.0.0/bundler/gems/rubocop-config-2b861962124a}/rubocop-config.gemspec +11 -11
  28. data/vendor/bundle/ruby/4.0.0/gems/actionpack-8.1.3/CHANGELOG.md +514 -0
  29. data/vendor/bundle/ruby/{3.4.0/gems/actionpack-8.0.1 → 4.0.0/gems/actionpack-8.1.3}/README.rdoc +1 -1
  30. data/vendor/bundle/ruby/4.0.0/gems/actionview-8.1.3/CHANGELOG.md +191 -0
  31. data/vendor/bundle/ruby/{3.4.0/gems/actionview-8.0.1 → 4.0.0/gems/actionview-8.1.3}/README.rdoc +1 -1
  32. data/vendor/bundle/ruby/4.0.0/gems/activemodel-8.1.3/CHANGELOG.md +68 -0
  33. data/vendor/bundle/ruby/{3.4.0/gems/activemodel-8.0.1 → 4.0.0/gems/activemodel-8.1.3}/README.rdoc +1 -1
  34. data/vendor/bundle/ruby/4.0.0/gems/activesupport-8.1.3/CHANGELOG.md +561 -0
  35. data/vendor/bundle/ruby/{3.4.0/gems/activesupport-8.0.1 → 4.0.0/gems/activesupport-8.1.3}/README.rdoc +1 -1
  36. data/vendor/bundle/ruby/{3.4.0/gems/addressable-2.8.7 → 4.0.0/gems/addressable-2.9.0}/CHANGELOG.md +71 -46
  37. data/vendor/bundle/ruby/{3.4.0/gems/addressable-2.8.7 → 4.0.0/gems/addressable-2.9.0}/README.md +6 -6
  38. data/vendor/bundle/ruby/4.0.0/gems/ast-2.4.3/LICENSE.MIT +20 -0
  39. data/vendor/bundle/ruby/4.0.0/gems/ast-2.4.3/README.YARD.md +12 -0
  40. data/vendor/bundle/ruby/{3.4.0/gems/bigdecimal-3.1.9 → 4.0.0/gems/bigdecimal-4.1.2}/bigdecimal.gemspec +6 -1
  41. data/vendor/bundle/ruby/{3.4.0/gems/concurrent-ruby-1.3.5 → 4.0.0/gems/concurrent-ruby-1.3.7}/CHANGELOG.md +12 -0
  42. data/vendor/bundle/ruby/{3.4.0/gems/concurrent-ruby-1.3.5 → 4.0.0/gems/concurrent-ruby-1.3.7}/README.md +4 -2
  43. data/vendor/bundle/ruby/{3.4.0/gems/connection_pool-2.5.0 → 4.0.0/gems/connection_pool-3.0.2}/README.md +49 -34
  44. data/vendor/bundle/ruby/4.0.0/gems/connection_pool-3.0.2/connection_pool.gemspec +35 -0
  45. data/vendor/bundle/ruby/4.0.0/gems/diff-lcs-1.6.2/CHANGELOG.md +518 -0
  46. data/vendor/bundle/ruby/4.0.0/gems/diff-lcs-1.6.2/README.md +92 -0
  47. data/vendor/bundle/ruby/4.0.0/gems/docile-1.4.1/LICENSE +21 -0
  48. data/vendor/bundle/ruby/4.0.0/gems/docile-1.4.1/README.md +409 -0
  49. data/vendor/bundle/ruby/4.0.0/gems/docile-1.4.1/docile.gemspec +36 -0
  50. data/vendor/bundle/ruby/{3.4.0/gems/drb-2.2.1 → 4.0.0/gems/drb-2.2.3}/drb.gemspec +2 -1
  51. data/vendor/bundle/ruby/{3.4.0/gems/ethon-0.16.0 → 4.0.0/gems/ethon-0.18.0}/CHANGELOG.md +43 -1
  52. data/vendor/bundle/ruby/{3.4.0/gems/ethon-0.16.0 → 4.0.0/gems/ethon-0.18.0}/README.md +1 -1
  53. data/vendor/bundle/ruby/4.0.0/gems/ethon-0.18.0/ethon.gemspec +37 -0
  54. data/vendor/bundle/ruby/{3.4.0/gems/ffi-1.17.1-x86_64-linux-gnu → 4.0.0/gems/ffi-1.17.4-x86_64-linux-gnu}/CHANGELOG.md +42 -0
  55. data/vendor/bundle/ruby/{3.4.0/gems/ffi-1.17.1-x86_64-linux-gnu → 4.0.0/gems/ffi-1.17.4-x86_64-linux-gnu}/README.md +1 -0
  56. data/vendor/bundle/ruby/{3.4.0/gems/ffi-1.17.1-x86_64-linux-gnu → 4.0.0/gems/ffi-1.17.4-x86_64-linux-gnu}/ffi.gemspec +7 -6
  57. data/vendor/bundle/ruby/{3.4.0/gems/hashdiff-1.1.2 → 4.0.0/gems/hashdiff-1.2.1}/README.md +26 -1
  58. data/vendor/bundle/ruby/4.0.0/gems/hashdiff-1.2.1/changelog.md +127 -0
  59. data/vendor/bundle/ruby/{3.4.0/gems/i18n-1.14.6 → 4.0.0/gems/i18n-1.15.2}/README.md +13 -1
  60. data/vendor/bundle/ruby/{3.4.0/gems/json-2.9.1 → 4.0.0/gems/json-2.19.9}/README.md +117 -2
  61. data/vendor/bundle/ruby/{3.4.0/gems/json-2.9.1 → 4.0.0/gems/json-2.19.9}/json.gemspec +4 -6
  62. data/vendor/bundle/ruby/4.0.0/gems/language_server-protocol-3.17.0.5/LICENSE.txt +21 -0
  63. data/vendor/bundle/ruby/4.0.0/gems/language_server-protocol-3.17.0.5/README.md +88 -0
  64. data/vendor/bundle/ruby/4.0.0/gems/lint_roller-1.1.0/CHANGELOG.md +15 -0
  65. data/vendor/bundle/ruby/4.0.0/gems/lint_roller-1.1.0/LICENSE.txt +21 -0
  66. data/vendor/bundle/ruby/4.0.0/gems/lint_roller-1.1.0/README.md +173 -0
  67. data/vendor/bundle/ruby/{3.4.0/gems/loofah-2.24.0 → 4.0.0/gems/loofah-2.25.1}/CHANGELOG.md +17 -0
  68. data/vendor/bundle/ruby/{3.4.0/gems/minitest-5.25.4 → 4.0.0/gems/minitest-6.0.6}/README.rdoc +33 -105
  69. data/vendor/bundle/ruby/4.0.0/gems/msgpack-1.8.3/ChangeLog +383 -0
  70. data/vendor/bundle/ruby/4.0.0/gems/msgpack-1.8.3/LICENSE +177 -0
  71. data/vendor/bundle/ruby/4.0.0/gems/msgpack-1.8.3/README.md +302 -0
  72. data/vendor/bundle/ruby/4.0.0/gems/msgpack-1.8.3/msgpack.gemspec +41 -0
  73. data/vendor/bundle/ruby/4.0.0/gems/multi_json-1.21.1/LICENSE.md +20 -0
  74. data/vendor/bundle/ruby/4.0.0/gems/multi_json-1.21.1/README.md +281 -0
  75. data/vendor/bundle/ruby/{3.4.0/gems/nokogiri-1.18.1-x86_64-linux-gnu → 4.0.0/gems/nokogiri-1.19.4-x86_64-linux-gnu}/LICENSE-DEPENDENCIES.md +187 -0
  76. data/vendor/bundle/ruby/{3.4.0/gems/nokogiri-1.18.1-x86_64-linux-gnu → 4.0.0/gems/nokogiri-1.19.4-x86_64-linux-gnu}/README.md +18 -3
  77. data/vendor/bundle/ruby/4.0.0/gems/opentelemetry-api-1.10.0/CHANGELOG.md +219 -0
  78. data/vendor/bundle/ruby/4.0.0/gems/opentelemetry-api-1.10.0/LICENSE +201 -0
  79. data/vendor/bundle/ruby/4.0.0/gems/opentelemetry-api-1.10.0/README.md +68 -0
  80. data/vendor/bundle/ruby/4.0.0/gems/opentelemetry-common-0.25.0/CHANGELOG.md +110 -0
  81. data/vendor/bundle/ruby/4.0.0/gems/opentelemetry-common-0.25.0/LICENSE +201 -0
  82. data/vendor/bundle/ruby/4.0.0/gems/opentelemetry-common-0.25.0/README.md +62 -0
  83. data/vendor/bundle/ruby/4.0.0/gems/parallel-2.1.0/MIT-LICENSE.txt +20 -0
  84. data/vendor/bundle/ruby/{3.4.0/gems/rspec-collection_matchers-1.2.1 → 4.0.0/gems/parser-3.3.11.1}/LICENSE.txt +4 -5
  85. data/vendor/bundle/ruby/4.0.0/gems/parser-3.3.11.1/parser.gemspec +43 -0
  86. data/vendor/bundle/ruby/4.0.0/gems/prism-1.9.0/CHANGELOG.md +786 -0
  87. data/vendor/bundle/ruby/4.0.0/gems/prism-1.9.0/LICENSE.md +7 -0
  88. data/vendor/bundle/ruby/4.0.0/gems/prism-1.9.0/README.md +143 -0
  89. data/vendor/bundle/ruby/4.0.0/gems/prism-1.9.0/prism.gemspec +172 -0
  90. data/vendor/bundle/ruby/4.0.0/gems/public_suffix-7.0.5/CHANGELOG.md +649 -0
  91. data/vendor/bundle/ruby/{3.4.0/gems/public_suffix-6.0.1 → 4.0.0/gems/public_suffix-7.0.5}/LICENSE.txt +1 -1
  92. data/vendor/bundle/ruby/{3.4.0/gems/public_suffix-6.0.1 → 4.0.0/gems/public_suffix-7.0.5}/README.md +38 -29
  93. data/vendor/bundle/ruby/{3.4.0/gems/rack-3.1.8 → 4.0.0/gems/rack-3.2.6}/CHANGELOG.md +351 -3
  94. data/vendor/bundle/ruby/{3.4.0/gems/rack-3.1.8 → 4.0.0/gems/rack-3.2.6}/README.md +76 -20
  95. data/vendor/bundle/ruby/{3.4.0/gems/rails-dom-testing-2.2.0 → 4.0.0/gems/rails-dom-testing-2.3.0}/README.md +3 -0
  96. data/vendor/bundle/ruby/{3.4.0/gems/rails-html-sanitizer-1.6.2 → 4.0.0/gems/rails-html-sanitizer-1.7.0}/CHANGELOG.md +10 -0
  97. data/vendor/bundle/ruby/4.0.0/gems/rainbow-3.1.1/Changelog.md +101 -0
  98. data/vendor/bundle/ruby/4.0.0/gems/rainbow-3.1.1/LICENSE +20 -0
  99. data/vendor/bundle/ruby/4.0.0/gems/rainbow-3.1.1/README.markdown +227 -0
  100. data/vendor/bundle/ruby/{3.4.0/gems/rake-13.2.1 → 4.0.0/gems/rake-13.4.2}/README.rdoc +5 -5
  101. data/vendor/bundle/ruby/{3.4.0/gems/rake-13.2.1 → 4.0.0/gems/rake-13.4.2}/rake.gemspec +3 -2
  102. data/vendor/bundle/ruby/{3.4.0/gems/rake-release-1.3.0 → 4.0.0/gems/rake-release-1.4.0}/rake-release.gemspec +4 -4
  103. data/vendor/bundle/ruby/4.0.0/gems/regexp_parser-2.12.0/LICENSE +22 -0
  104. data/vendor/bundle/ruby/4.0.0/gems/regexp_parser-2.12.0/regexp_parser.gemspec +36 -0
  105. data/vendor/bundle/ruby/{3.4.0/gems/rspec-core-3.13.2 → 4.0.0/gems/rspec-core-3.13.6}/Changelog.md +293 -261
  106. data/vendor/bundle/ruby/{3.4.0/gems/rspec-expectations-3.13.3 → 4.0.0/gems/rspec-expectations-3.13.5}/Changelog.md +154 -140
  107. data/vendor/bundle/ruby/{3.4.0/gems/rspec-mocks-3.13.2 → 4.0.0/gems/rspec-mocks-3.13.8}/Changelog.md +181 -129
  108. data/vendor/bundle/ruby/{3.4.0/gems/rspec-support-3.13.2 → 4.0.0/gems/rspec-support-3.13.7}/Changelog.md +101 -65
  109. data/vendor/bundle/ruby/4.0.0/gems/rubocop-1.88.0/LICENSE.txt +20 -0
  110. data/vendor/bundle/ruby/4.0.0/gems/rubocop-1.88.0/README.md +255 -0
  111. data/vendor/bundle/ruby/4.0.0/gems/rubocop-ast-1.49.1/LICENSE.txt +20 -0
  112. data/vendor/bundle/ruby/4.0.0/gems/rubocop-ast-1.49.1/README.md +54 -0
  113. data/vendor/bundle/ruby/4.0.0/gems/rubocop-capybara-2.23.0/CHANGELOG.md +116 -0
  114. data/vendor/bundle/ruby/{3.4.0/gems/diff-lcs-1.5.1/License.md → 4.0.0/gems/rubocop-capybara-2.23.0/MIT-LICENSE.md} +2 -22
  115. data/vendor/bundle/ruby/4.0.0/gems/rubocop-capybara-2.23.0/README.md +91 -0
  116. data/vendor/bundle/ruby/4.0.0/gems/rubocop-factory_bot-2.28.0/CHANGELOG.md +135 -0
  117. data/vendor/bundle/ruby/4.0.0/gems/rubocop-factory_bot-2.28.0/MIT-LICENSE.md +21 -0
  118. data/vendor/bundle/ruby/4.0.0/gems/rubocop-factory_bot-2.28.0/README.md +91 -0
  119. data/vendor/bundle/ruby/4.0.0/gems/rubocop-performance-1.26.1/LICENSE.txt +20 -0
  120. data/vendor/bundle/ruby/4.0.0/gems/rubocop-performance-1.26.1/README.md +100 -0
  121. data/vendor/bundle/ruby/4.0.0/gems/rubocop-rspec-3.10.2/CHANGELOG.md +1136 -0
  122. data/vendor/bundle/ruby/4.0.0/gems/rubocop-rspec-3.10.2/MIT-LICENSE.md +21 -0
  123. data/vendor/bundle/ruby/4.0.0/gems/rubocop-rspec-3.10.2/README.md +112 -0
  124. data/vendor/bundle/ruby/4.0.0/gems/rubocop-rspec_rails-2.32.0/CHANGELOG.md +98 -0
  125. data/vendor/bundle/ruby/4.0.0/gems/rubocop-rspec_rails-2.32.0/MIT-LICENSE.md +21 -0
  126. data/vendor/bundle/ruby/4.0.0/gems/rubocop-rspec_rails-2.32.0/README.md +93 -0
  127. data/vendor/bundle/ruby/4.0.0/gems/ruby-progressbar-1.13.0/LICENSE.txt +19 -0
  128. data/vendor/bundle/ruby/4.0.0/gems/ruby-progressbar-1.13.0/README.md +131 -0
  129. data/vendor/bundle/ruby/4.0.0/gems/simplecov-0.22.0/CHANGELOG.md +191 -0
  130. data/vendor/bundle/ruby/4.0.0/gems/simplecov-0.22.0/LICENSE +20 -0
  131. data/vendor/bundle/ruby/4.0.0/gems/simplecov-0.22.0/README.md +974 -0
  132. data/vendor/bundle/ruby/4.0.0/gems/simplecov-cobertura-3.2.0/LICENSE +202 -0
  133. data/vendor/bundle/ruby/4.0.0/gems/simplecov-cobertura-3.2.0/README.md +65 -0
  134. data/vendor/bundle/ruby/4.0.0/gems/simplecov-cobertura-3.2.0/simplecov-cobertura.gemspec +29 -0
  135. data/vendor/bundle/ruby/4.0.0/gems/simplecov-html-0.13.2/CHANGELOG.md +114 -0
  136. data/vendor/bundle/ruby/4.0.0/gems/simplecov-html-0.13.2/LICENSE +20 -0
  137. data/vendor/bundle/ruby/4.0.0/gems/simplecov-html-0.13.2/README.md +30 -0
  138. data/vendor/bundle/ruby/4.0.0/gems/simplecov_json_formatter-0.1.4/CHANGELOG.md +13 -0
  139. data/vendor/bundle/ruby/4.0.0/gems/simplecov_json_formatter-0.1.4/README.md +29 -0
  140. data/vendor/bundle/ruby/{3.4.0/gems/thor-1.3.2 → 4.0.0/gems/thor-1.5.0}/README.md +1 -2
  141. data/vendor/bundle/ruby/{3.4.0/gems/thor-1.3.2 → 4.0.0/gems/thor-1.5.0}/thor.gemspec +3 -3
  142. data/vendor/bundle/ruby/{3.4.0/gems/typhoeus-1.4.1 → 4.0.0/gems/typhoeus-1.6.0}/CHANGELOG.md +56 -1
  143. data/vendor/bundle/ruby/{3.4.0/gems/typhoeus-1.4.1 → 4.0.0/gems/typhoeus-1.6.0}/README.md +2 -2
  144. data/vendor/bundle/ruby/{3.4.0/gems/typhoeus-1.4.1 → 4.0.0/gems/typhoeus-1.6.0}/typhoeus.gemspec +14 -4
  145. data/vendor/bundle/ruby/4.0.0/gems/unicode-display_width-3.2.0/CHANGELOG.md +299 -0
  146. data/vendor/bundle/ruby/4.0.0/gems/unicode-display_width-3.2.0/MIT-LICENSE.txt +22 -0
  147. data/vendor/bundle/ruby/4.0.0/gems/unicode-display_width-3.2.0/README.md +194 -0
  148. data/vendor/bundle/ruby/4.0.0/gems/unicode-emoji-4.2.0/CHANGELOG.md +202 -0
  149. data/vendor/bundle/ruby/4.0.0/gems/unicode-emoji-4.2.0/MIT-LICENSE.txt +20 -0
  150. data/vendor/bundle/ruby/4.0.0/gems/unicode-emoji-4.2.0/README.md +205 -0
  151. data/vendor/bundle/ruby/4.0.0/gems/unicode-emoji-4.2.0/unicode-emoji.gemspec +22 -0
  152. data/vendor/bundle/ruby/{3.4.0/gems/uri-1.0.2 → 4.0.0/gems/uri-1.1.1}/README.md +1 -1
  153. data/vendor/bundle/ruby/{3.4.0/gems/webmock-3.24.0 → 4.0.0/gems/webmock-3.26.2}/CHANGELOG.md +44 -0
  154. data/vendor/bundle/ruby/{3.4.0/gems/webmock-3.24.0 → 4.0.0/gems/webmock-3.26.2}/README.md +7 -0
  155. data/vendor/bundle/ruby/{3.4.0/specifications/actionpack-8.0.1.gemspec → 4.0.0/specifications/actionpack-8.1.3.gemspec} +9 -9
  156. data/vendor/bundle/ruby/{3.4.0/specifications/actionview-8.0.1.gemspec → 4.0.0/specifications/actionview-8.1.3.gemspec} +9 -9
  157. data/vendor/bundle/ruby/{3.4.0/specifications/activemodel-8.0.1.gemspec → 4.0.0/specifications/activemodel-8.1.3.gemspec} +7 -7
  158. data/vendor/bundle/ruby/{3.4.0/specifications/activesupport-8.0.1.gemspec → 4.0.0/specifications/activesupport-8.1.3.gemspec} +7 -7
  159. data/vendor/bundle/ruby/{3.4.0/specifications/addressable-2.8.7.gemspec → 4.0.0/specifications/addressable-2.9.0.gemspec} +7 -8
  160. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/appraisal-2.5.0.gemspec +1 -1
  161. data/vendor/bundle/ruby/4.0.0/specifications/ast-2.4.3.gemspec +29 -0
  162. data/vendor/bundle/ruby/{3.4.0/specifications/base64-0.2.0.gemspec → 4.0.0/specifications/base64-0.3.0.gemspec} +6 -6
  163. data/vendor/bundle/ruby/{3.4.0/specifications/bigdecimal-3.1.9.gemspec → 4.0.0/specifications/bigdecimal-4.1.2.gemspec} +6 -6
  164. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/builder-3.3.0.gemspec +1 -1
  165. data/vendor/bundle/ruby/{3.4.0/specifications/concurrent-ruby-1.3.5.gemspec → 4.0.0/specifications/concurrent-ruby-1.3.7.gemspec} +6 -6
  166. data/vendor/bundle/ruby/{3.4.0/specifications/connection_pool-2.5.0.gemspec → 4.0.0/specifications/connection_pool-3.0.2.gemspec} +8 -8
  167. data/vendor/bundle/ruby/{3.4.0/specifications/crack-1.0.0.gemspec → 4.0.0/specifications/crack-1.0.1.gemspec} +4 -4
  168. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/crass-1.0.6.gemspec +1 -1
  169. data/vendor/bundle/ruby/4.0.0/specifications/diff-lcs-1.6.2.gemspec +35 -0
  170. data/vendor/bundle/ruby/4.0.0/specifications/docile-1.4.1.gemspec +22 -0
  171. data/vendor/bundle/ruby/{3.4.0/specifications/drb-2.2.1.gemspec → 4.0.0/specifications/drb-2.2.3.gemspec} +6 -6
  172. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/erubi-1.13.1.gemspec +1 -1
  173. data/vendor/bundle/ruby/4.0.0/specifications/ethon-0.18.0.gemspec +27 -0
  174. data/vendor/bundle/ruby/{3.4.0/specifications/ffi-1.17.1-x86_64-linux-gnu.gemspec → 4.0.0/specifications/ffi-1.17.4-x86_64-linux-gnu.gemspec} +7 -14
  175. data/vendor/bundle/ruby/{3.4.0/specifications/hashdiff-1.1.2.gemspec → 4.0.0/specifications/hashdiff-1.2.1.gemspec} +4 -4
  176. data/vendor/bundle/ruby/{3.4.0/specifications/i18n-1.14.6.gemspec → 4.0.0/specifications/i18n-1.15.2.gemspec} +6 -7
  177. data/vendor/bundle/ruby/{3.4.0/specifications/json-2.9.1.gemspec → 4.0.0/specifications/json-2.19.9.gemspec} +0 -0
  178. data/vendor/bundle/ruby/4.0.0/specifications/language_server-protocol-3.17.0.5.gemspec +31 -0
  179. data/vendor/bundle/ruby/4.0.0/specifications/lint_roller-1.1.0.gemspec +22 -0
  180. data/vendor/bundle/ruby/{3.4.0/specifications/logger-1.6.5.gemspec → 4.0.0/specifications/logger-1.7.0.gemspec} +4 -4
  181. data/vendor/bundle/ruby/{3.4.0/specifications/loofah-2.24.0.gemspec → 4.0.0/specifications/loofah-2.25.1.gemspec} +5 -5
  182. data/vendor/bundle/ruby/4.0.0/specifications/minitest-6.0.6.gemspec +35 -0
  183. data/vendor/bundle/ruby/4.0.0/specifications/msgpack-1.8.3.gemspec +36 -0
  184. data/vendor/bundle/ruby/4.0.0/specifications/multi_json-1.21.1.gemspec +22 -0
  185. data/vendor/bundle/ruby/{3.4.0/specifications/nokogiri-1.18.1-x86_64-linux-gnu.gemspec → 4.0.0/specifications/nokogiri-1.19.4-x86_64-linux-gnu.gemspec} +7 -7
  186. data/vendor/bundle/ruby/4.0.0/specifications/opentelemetry-api-1.10.0.gemspec +35 -0
  187. data/vendor/bundle/ruby/4.0.0/specifications/opentelemetry-common-0.25.0.gemspec +33 -0
  188. data/vendor/bundle/ruby/4.0.0/specifications/parallel-2.1.0.gemspec +21 -0
  189. data/vendor/bundle/ruby/4.0.0/specifications/parser-3.3.11.1.gemspec +37 -0
  190. data/vendor/bundle/ruby/4.0.0/specifications/prism-1.9.0.gemspec +24 -0
  191. data/vendor/bundle/ruby/{3.4.0/specifications/public_suffix-6.0.1.gemspec → 4.0.0/specifications/public_suffix-7.0.5.gemspec} +7 -7
  192. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/racc-1.8.1.gemspec +1 -1
  193. data/vendor/bundle/ruby/{3.4.0/specifications/rack-3.1.8.gemspec → 4.0.0/specifications/rack-3.2.6.gemspec} +7 -7
  194. data/vendor/bundle/ruby/{3.4.0/specifications/rack-session-2.1.0.gemspec → 4.0.0/specifications/rack-session-2.1.2.gemspec} +5 -5
  195. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/rack-test-2.2.0.gemspec +1 -1
  196. data/vendor/bundle/ruby/{3.4.0/specifications/rails-dom-testing-2.2.0.gemspec → 4.0.0/specifications/rails-dom-testing-2.3.0.gemspec} +5 -5
  197. data/vendor/bundle/ruby/{3.4.0/specifications/rails-html-sanitizer-1.6.2.gemspec → 4.0.0/specifications/rails-html-sanitizer-1.7.0.gemspec} +7 -7
  198. data/vendor/bundle/ruby/4.0.0/specifications/rainbow-3.1.1.gemspec +25 -0
  199. data/vendor/bundle/ruby/{3.4.0/specifications/rake-13.2.1.gemspec → 4.0.0/specifications/rake-13.4.2.gemspec} +6 -6
  200. data/vendor/bundle/ruby/{3.4.0/specifications/rake-release-1.3.0.gemspec → 4.0.0/specifications/rake-release-1.4.0.gemspec} +7 -7
  201. data/vendor/bundle/ruby/4.0.0/specifications/regexp_parser-2.12.0.gemspec +22 -0
  202. data/vendor/bundle/ruby/{3.4.0/specifications/rexml-3.4.0.gemspec → 4.0.0/specifications/rexml-3.4.4.gemspec} +6 -6
  203. data/vendor/bundle/ruby/{3.4.0/specifications/rspec-3.13.0.gemspec → 4.0.0/specifications/rspec-3.13.2.gemspec} +9 -9
  204. data/vendor/bundle/ruby/4.0.0/specifications/rspec-core-3.13.6.gemspec +31 -0
  205. data/vendor/bundle/ruby/4.0.0/specifications/rspec-expectations-3.13.5.gemspec +29 -0
  206. data/vendor/bundle/ruby/4.0.0/specifications/rspec-mocks-3.13.8.gemspec +29 -0
  207. data/vendor/bundle/ruby/{3.4.0/specifications/rspec-support-3.13.2.gemspec → 4.0.0/specifications/rspec-support-3.13.7.gemspec} +9 -9
  208. data/vendor/bundle/ruby/4.0.0/specifications/rubocop-1.88.0.gemspec +39 -0
  209. data/vendor/bundle/ruby/4.0.0/specifications/rubocop-ast-1.49.1.gemspec +29 -0
  210. data/vendor/bundle/ruby/4.0.0/specifications/rubocop-capybara-2.23.0.gemspec +28 -0
  211. data/vendor/bundle/ruby/4.0.0/specifications/rubocop-factory_bot-2.28.0.gemspec +28 -0
  212. data/vendor/bundle/ruby/4.0.0/specifications/rubocop-performance-1.26.1.gemspec +30 -0
  213. data/vendor/bundle/ruby/4.0.0/specifications/rubocop-rspec-3.10.2.gemspec +30 -0
  214. data/vendor/bundle/ruby/4.0.0/specifications/rubocop-rspec_rails-2.32.0.gemspec +29 -0
  215. data/vendor/bundle/ruby/4.0.0/specifications/ruby-progressbar-1.13.0.gemspec +29 -0
  216. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/securerandom-0.4.1.gemspec +1 -1
  217. data/vendor/bundle/ruby/4.0.0/specifications/simplecov-0.22.0.gemspec +28 -0
  218. data/vendor/bundle/ruby/4.0.0/specifications/simplecov-cobertura-3.2.0.gemspec +29 -0
  219. data/vendor/bundle/ruby/4.0.0/specifications/simplecov-html-0.13.2.gemspec +22 -0
  220. data/vendor/bundle/ruby/4.0.0/specifications/simplecov_json_formatter-0.1.4.gemspec +21 -0
  221. data/vendor/bundle/ruby/{3.4.0/specifications/thor-1.3.2.gemspec → 4.0.0/specifications/thor-1.5.0.gemspec} +8 -8
  222. data/vendor/bundle/ruby/4.0.0/specifications/typhoeus-1.6.0.gemspec +26 -0
  223. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/tzinfo-2.0.6.gemspec +1 -1
  224. data/vendor/bundle/ruby/4.0.0/specifications/unicode-display_width-3.2.0.gemspec +30 -0
  225. data/vendor/bundle/ruby/4.0.0/specifications/unicode-emoji-4.2.0.gemspec +22 -0
  226. data/vendor/bundle/ruby/{3.4.0/specifications/uri-1.0.2.gemspec → 4.0.0/specifications/uri-1.1.1.gemspec} +5 -5
  227. data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/specifications/useragent-0.16.11.gemspec +1 -1
  228. data/vendor/bundle/ruby/{3.4.0/specifications/webmock-3.24.0.gemspec → 4.0.0/specifications/webmock-3.26.2.gemspec} +7 -8
  229. metadata +304 -196
  230. data/vendor/bundle/ruby/3.4.0/bundler/gems/rubocop-config-67802c9d1826/README.md +0 -23
  231. data/vendor/bundle/ruby/3.4.0/gems/actionpack-8.0.1/CHANGELOG.md +0 -205
  232. data/vendor/bundle/ruby/3.4.0/gems/actionview-8.0.1/CHANGELOG.md +0 -67
  233. data/vendor/bundle/ruby/3.4.0/gems/activemodel-8.0.1/CHANGELOG.md +0 -110
  234. data/vendor/bundle/ruby/3.4.0/gems/activesupport-8.0.1/CHANGELOG.md +0 -157
  235. data/vendor/bundle/ruby/3.4.0/gems/addressable-2.8.7/addressable.gemspec +0 -28
  236. data/vendor/bundle/ruby/3.4.0/gems/benchmark-0.4.0/README.md +0 -138
  237. data/vendor/bundle/ruby/3.4.0/gems/benchmark-0.4.0/benchmark.gemspec +0 -32
  238. data/vendor/bundle/ruby/3.4.0/gems/connection_pool-2.5.0/connection_pool.gemspec +0 -24
  239. data/vendor/bundle/ruby/3.4.0/gems/diff-lcs-1.5.1/README.rdoc +0 -84
  240. data/vendor/bundle/ruby/3.4.0/gems/ethon-0.16.0/ethon.gemspec +0 -26
  241. data/vendor/bundle/ruby/3.4.0/gems/hashdiff-1.1.2/changelog.md +0 -119
  242. data/vendor/bundle/ruby/3.4.0/gems/logger-1.6.5/logger.gemspec +0 -28
  243. data/vendor/bundle/ruby/3.4.0/gems/multi_json-1.15.0/CHANGELOG.md +0 -275
  244. data/vendor/bundle/ruby/3.4.0/gems/multi_json-1.15.0/LICENSE.md +0 -20
  245. data/vendor/bundle/ruby/3.4.0/gems/multi_json-1.15.0/README.md +0 -121
  246. data/vendor/bundle/ruby/3.4.0/gems/public_suffix-6.0.1/CHANGELOG.md +0 -491
  247. data/vendor/bundle/ruby/3.4.0/gems/rexml-3.4.0/LICENSE.txt +0 -22
  248. data/vendor/bundle/ruby/3.4.0/gems/rspec-collection_matchers-1.2.1/Changelog.md +0 -68
  249. data/vendor/bundle/ruby/3.4.0/gems/rspec-collection_matchers-1.2.1/README.md +0 -76
  250. data/vendor/bundle/ruby/3.4.0/gems/rspec-collection_matchers-1.2.1/rspec-collection_matchers.gemspec +0 -33
  251. data/vendor/bundle/ruby/3.4.0/gems/rspec-its-2.0.0/Changelog.md +0 -73
  252. data/vendor/bundle/ruby/3.4.0/gems/rspec-its-2.0.0/LICENSE.txt +0 -27
  253. data/vendor/bundle/ruby/3.4.0/gems/rspec-its-2.0.0/README.md +0 -104
  254. data/vendor/bundle/ruby/3.4.0/gems/rspec-its-2.0.0/rspec-its.gemspec +0 -31
  255. data/vendor/bundle/ruby/3.4.0/specifications/benchmark-0.4.0.gemspec +0 -23
  256. data/vendor/bundle/ruby/3.4.0/specifications/diff-lcs-1.5.1.gemspec +0 -37
  257. data/vendor/bundle/ruby/3.4.0/specifications/ethon-0.16.0.gemspec +0 -24
  258. data/vendor/bundle/ruby/3.4.0/specifications/minitest-5.25.4.gemspec +0 -31
  259. data/vendor/bundle/ruby/3.4.0/specifications/multi_json-1.15.0.gemspec +0 -26
  260. data/vendor/bundle/ruby/3.4.0/specifications/rspec-collection_matchers-1.2.1.gemspec +0 -27
  261. data/vendor/bundle/ruby/3.4.0/specifications/rspec-core-3.13.2.gemspec +0 -39
  262. data/vendor/bundle/ruby/3.4.0/specifications/rspec-expectations-3.13.3.gemspec +0 -33
  263. data/vendor/bundle/ruby/3.4.0/specifications/rspec-its-2.0.0.gemspec +0 -27
  264. data/vendor/bundle/ruby/3.4.0/specifications/rspec-mocks-3.13.2.gemspec +0 -33
  265. data/vendor/bundle/ruby/3.4.0/specifications/typhoeus-1.4.1.gemspec +0 -24
  266. /data/vendor/bundle/ruby/{3.4.0/bundler/gems/rubocop-config-67802c9d1826 → 4.0.0/bundler/gems/rubocop-config-2b861962124a}/LICENSE +0 -0
  267. /data/vendor/bundle/ruby/{3.4.0/gems/actionpack-8.0.1 → 4.0.0/gems/actionpack-8.1.3}/MIT-LICENSE +0 -0
  268. /data/vendor/bundle/ruby/{3.4.0/gems/actionview-8.0.1 → 4.0.0/gems/actionview-8.1.3}/MIT-LICENSE +0 -0
  269. /data/vendor/bundle/ruby/{3.4.0/gems/activemodel-8.0.1 → 4.0.0/gems/activemodel-8.1.3}/MIT-LICENSE +0 -0
  270. /data/vendor/bundle/ruby/{3.4.0/gems/activesupport-8.0.1 → 4.0.0/gems/activesupport-8.1.3}/MIT-LICENSE +0 -0
  271. /data/vendor/bundle/ruby/{3.4.0/gems/addressable-2.8.7 → 4.0.0/gems/addressable-2.9.0}/LICENSE.txt +0 -0
  272. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/appraisal-2.5.0/MIT-LICENSE +0 -0
  273. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/appraisal-2.5.0/README.md +0 -0
  274. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/appraisal-2.5.0/appraisal.gemspec +0 -0
  275. /data/vendor/bundle/ruby/{3.4.0/gems/base64-0.2.0 → 4.0.0/gems/base64-0.3.0}/README.md +0 -0
  276. /data/vendor/bundle/ruby/{3.4.0/gems/bigdecimal-3.1.9 → 4.0.0/gems/bigdecimal-4.1.2}/LICENSE +0 -0
  277. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/builder-3.3.0/MIT-LICENSE +0 -0
  278. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/builder-3.3.0/README.md +0 -0
  279. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/builder-3.3.0/builder.gemspec +0 -0
  280. /data/vendor/bundle/ruby/{3.4.0/gems/concurrent-ruby-1.3.5 → 4.0.0/gems/concurrent-ruby-1.3.7}/LICENSE.txt +0 -0
  281. /data/vendor/bundle/ruby/{3.4.0/gems/connection_pool-2.5.0 → 4.0.0/gems/connection_pool-3.0.2}/LICENSE +0 -0
  282. /data/vendor/bundle/ruby/{3.4.0/gems/crack-1.0.0 → 4.0.0/gems/crack-1.0.1}/LICENSE +0 -0
  283. /data/vendor/bundle/ruby/{3.4.0/gems/crack-1.0.0 → 4.0.0/gems/crack-1.0.1}/README.md +0 -0
  284. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/crass-1.0.6/LICENSE +0 -0
  285. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/crass-1.0.6/README.md +0 -0
  286. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/crass-1.0.6/crass.gemspec +0 -0
  287. /data/vendor/bundle/ruby/{3.4.0/gems/base64-0.2.0 → 4.0.0/gems/drb-2.2.3}/LICENSE.txt +0 -0
  288. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/erubi-1.13.1/CHANGELOG +0 -0
  289. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/erubi-1.13.1/MIT-LICENSE +0 -0
  290. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/erubi-1.13.1/README.rdoc +0 -0
  291. /data/vendor/bundle/ruby/{3.4.0/gems/ethon-0.16.0 → 4.0.0/gems/ethon-0.18.0}/LICENSE +0 -0
  292. /data/vendor/bundle/ruby/{3.4.0/gems/ffi-1.17.1-x86_64-linux-gnu → 4.0.0/gems/ffi-1.17.4-x86_64-linux-gnu}/LICENSE +0 -0
  293. /data/vendor/bundle/ruby/{3.4.0/gems/ffi-1.17.1-x86_64-linux-gnu → 4.0.0/gems/ffi-1.17.4-x86_64-linux-gnu}/LICENSE.SPECS +0 -0
  294. /data/vendor/bundle/ruby/{3.4.0/gems/hashdiff-1.1.2 → 4.0.0/gems/hashdiff-1.2.1}/LICENSE +0 -0
  295. /data/vendor/bundle/ruby/{3.4.0/gems/hashdiff-1.1.2 → 4.0.0/gems/hashdiff-1.2.1}/hashdiff.gemspec +0 -0
  296. /data/vendor/bundle/ruby/{3.4.0/gems/i18n-1.14.6 → 4.0.0/gems/i18n-1.15.2}/MIT-LICENSE +0 -0
  297. /data/vendor/bundle/ruby/{3.4.0/gems/logger-1.6.5 → 4.0.0/gems/logger-1.7.0}/README.md +0 -0
  298. /data/vendor/bundle/ruby/{3.4.0/gems/loofah-2.24.0 → 4.0.0/gems/loofah-2.25.1}/MIT-LICENSE.txt +0 -0
  299. /data/vendor/bundle/ruby/{3.4.0/gems/loofah-2.24.0 → 4.0.0/gems/loofah-2.25.1}/README.md +0 -0
  300. /data/vendor/bundle/ruby/{3.4.0/gems/nokogiri-1.18.1-x86_64-linux-gnu → 4.0.0/gems/nokogiri-1.19.4-x86_64-linux-gnu}/LICENSE.md +0 -0
  301. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/racc-1.8.1/ChangeLog +0 -0
  302. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/racc-1.8.1/README.ja.rdoc +0 -0
  303. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/racc-1.8.1/README.rdoc +0 -0
  304. /data/vendor/bundle/ruby/{3.4.0/gems/rack-3.1.8 → 4.0.0/gems/rack-3.2.6}/MIT-LICENSE +0 -0
  305. /data/vendor/bundle/ruby/{3.4.0/gems/rack-session-2.1.0 → 4.0.0/gems/rack-session-2.1.2}/license.md +0 -0
  306. /data/vendor/bundle/ruby/{3.4.0/gems/rack-session-2.1.0 → 4.0.0/gems/rack-session-2.1.2}/readme.md +0 -0
  307. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/rack-test-2.2.0/MIT-LICENSE.txt +0 -0
  308. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/rack-test-2.2.0/README.md +0 -0
  309. /data/vendor/bundle/ruby/{3.4.0/gems/rails-dom-testing-2.2.0 → 4.0.0/gems/rails-dom-testing-2.3.0}/MIT-LICENSE +0 -0
  310. /data/vendor/bundle/ruby/{3.4.0/gems/rails-html-sanitizer-1.6.2 → 4.0.0/gems/rails-html-sanitizer-1.7.0}/MIT-LICENSE +0 -0
  311. /data/vendor/bundle/ruby/{3.4.0/gems/rails-html-sanitizer-1.6.2 → 4.0.0/gems/rails-html-sanitizer-1.7.0}/README.md +0 -0
  312. /data/vendor/bundle/ruby/{3.4.0/gems/rake-13.2.1 → 4.0.0/gems/rake-13.4.2}/MIT-LICENSE +0 -0
  313. /data/vendor/bundle/ruby/{3.4.0/gems/rake-release-1.3.0 → 4.0.0/gems/rake-release-1.4.0}/LICENSE +0 -0
  314. /data/vendor/bundle/ruby/{3.4.0/gems/rake-release-1.3.0 → 4.0.0/gems/rake-release-1.4.0}/README.md +0 -0
  315. /data/vendor/bundle/ruby/{3.4.0/gems/drb-2.2.1 → 4.0.0/gems/rexml-3.4.4}/LICENSE.txt +0 -0
  316. /data/vendor/bundle/ruby/{3.4.0/gems/rexml-3.4.0 → 4.0.0/gems/rexml-3.4.4}/README.md +0 -0
  317. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-3.13.0 → 4.0.0/gems/rspec-3.13.2}/LICENSE.md +0 -0
  318. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-3.13.0 → 4.0.0/gems/rspec-3.13.2}/README.md +0 -0
  319. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-core-3.13.2 → 4.0.0/gems/rspec-core-3.13.6}/LICENSE.md +0 -0
  320. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-core-3.13.2 → 4.0.0/gems/rspec-core-3.13.6}/README.md +0 -0
  321. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-expectations-3.13.3 → 4.0.0/gems/rspec-expectations-3.13.5}/LICENSE.md +0 -0
  322. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-expectations-3.13.3 → 4.0.0/gems/rspec-expectations-3.13.5}/README.md +0 -0
  323. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-mocks-3.13.2 → 4.0.0/gems/rspec-mocks-3.13.8}/LICENSE.md +0 -0
  324. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-mocks-3.13.2 → 4.0.0/gems/rspec-mocks-3.13.8}/README.md +0 -0
  325. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-support-3.13.2 → 4.0.0/gems/rspec-support-3.13.7}/LICENSE.md +0 -0
  326. /data/vendor/bundle/ruby/{3.4.0/gems/rspec-support-3.13.2 → 4.0.0/gems/rspec-support-3.13.7}/README.md +0 -0
  327. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/securerandom-0.4.1/README.md +0 -0
  328. /data/vendor/bundle/ruby/{3.4.0/gems/thor-1.3.2 → 4.0.0/gems/thor-1.5.0}/LICENSE.md +0 -0
  329. /data/vendor/bundle/ruby/{3.4.0/gems/typhoeus-1.4.1 → 4.0.0/gems/typhoeus-1.6.0}/LICENSE +0 -0
  330. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/tzinfo-2.0.6/LICENSE +0 -0
  331. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/tzinfo-2.0.6/README.md +0 -0
  332. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/useragent-0.16.11/LICENSE +0 -0
  333. /data/vendor/bundle/ruby/{3.4.0 → 4.0.0}/gems/useragent-0.16.11/README.md +0 -0
  334. /data/vendor/bundle/ruby/{3.4.0/gems/webmock-3.24.0 → 4.0.0/gems/webmock-3.26.2}/LICENSE +0 -0
@@ -0,0 +1,409 @@
1
+ # Docile
2
+
3
+ [![Gem Version](https://img.shields.io/gem/v/docile.svg)](https://rubygems.org/gems/docile)
4
+ [![Gem Downloads](https://img.shields.io/gem/dt/docile.svg)](https://rubygems.org/gems/docile)
5
+
6
+ [![Join the chat at https://gitter.im/ms-ati/docile](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ms-ati/docile?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
7
+ [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://rubydoc.info/github/ms-ati/docile)
8
+
9
+ [![Build Status](https://github.com/ms-ati/docile/actions/workflows/main.yml/badge.svg)](https://github.com/ms-ati/docile/actions/workflows/main.yml)
10
+ [![Code Coverage](https://img.shields.io/codecov/c/github/ms-ati/docile.svg)](https://codecov.io/github/ms-ati/docile)
11
+ [![Maintainability](https://api.codeclimate.com/v1/badges/79ca631bc123f7b83b34/maintainability)](https://codeclimate.com/github/ms-ati/docile/maintainability)
12
+
13
+ Ruby makes it possible to create very expressive **Domain Specific
14
+ Languages**, or **DSL**'s for short. However, it requires some deep knowledge and
15
+ somewhat hairy meta-programming to get the interface just right.
16
+
17
+ "Docile" means *Ready to accept control or instruction; submissive* [[1]]
18
+
19
+ Instead of each Ruby project reinventing this wheel, let's make our Ruby DSL
20
+ coding a bit more docile...
21
+
22
+ [1]: http://www.google.com/search?q=docile+definition "Google"
23
+
24
+ ## Usage
25
+
26
+ ### Basic: Ruby [Array](http://ruby-doc.org/core-3.0.0/Array.html) as DSL
27
+
28
+ Let's say that we want to make a DSL for modifying Array objects.
29
+ Wouldn't it be great if we could just treat the methods of Array as a DSL?
30
+
31
+ ```ruby
32
+ with_array([]) do
33
+ push 1
34
+ push 2
35
+ pop
36
+ push 3
37
+ end
38
+ #=> [1, 3]
39
+ ```
40
+
41
+ No problem, just define the method `with_array` like this:
42
+
43
+ ```ruby
44
+ def with_array(arr=[], &block)
45
+ Docile.dsl_eval(arr, &block)
46
+ end
47
+ ```
48
+
49
+ Easy!
50
+
51
+ ### Next step: Allow helper methods to call DSL methods
52
+
53
+ What if, in our use of the methods of Array as a DSL, we want to extract
54
+ helper methods which in turn call DSL methods?
55
+
56
+ ```ruby
57
+ def pop_sum_and_push(n)
58
+ sum = 0
59
+ n.times { sum += pop }
60
+ push sum
61
+ end
62
+
63
+ Docile.dsl_eval([]) do
64
+ push 5
65
+ push 6
66
+ pop_sum_and_push(2)
67
+ end
68
+ #=> [11]
69
+ ```
70
+
71
+ Without Docile, you may find this sort of code extraction to be more
72
+ challenging.
73
+
74
+ ### Wait! Can't I do that with just `instance_eval` or `instance_exec`?
75
+
76
+ Good question!
77
+
78
+ In short: **No**.
79
+
80
+ Not if you want the code in the block to be able to refer to anything
81
+ the block would normally have access to from the surrounding context.
82
+
83
+ Let's be very specific. Docile internally uses `instance_exec` (see [execution.rb#26](lib/docile/execution.rb#L26)), adding a small layer to support referencing *local variables*, *instance variables*, and *methods* from the _block's context_ **or** the target _object's context_, interchangeably. This is "**the hard part**", where most folks making a DSL in Ruby throw up their hands.
84
+
85
+ For example:
86
+
87
+ ```ruby
88
+ class ContextOfBlock
89
+ def example_of_contexts
90
+ @block_instance_var = 1
91
+ block_local_var = 2
92
+
93
+ with_array do
94
+ push @block_instance_var
95
+ push block_local_var
96
+ pop
97
+ push block_sees_this_method
98
+ end
99
+ end
100
+
101
+ def block_sees_this_method
102
+ 3
103
+ end
104
+
105
+ def with_array(&block)
106
+ {
107
+ docile: Docile.dsl_eval([], &block),
108
+ instance_eval: ([].instance_eval(&block) rescue $!),
109
+ instance_exec: ([].instance_exec(&block) rescue $!)
110
+ }
111
+ end
112
+ end
113
+
114
+ ContextOfBlock.new.example_of_contexts
115
+ #=> {
116
+ :docile=>[1, 3],
117
+ :instance_eval=>#<NameError: undefined local variable or method `block_sees_this_method' for [nil]:Array>,
118
+ :instance_exec=>#<NameError: undefined local variable or method `block_sees_this_method' for [nil]:Array>
119
+ }
120
+ ```
121
+
122
+ As you can see, it won't be possible to call methods or access instance variables defined in the block's context using just the raw `instance_eval` or `instance_exec` methods. And in fact, Docile goes further, making it easy to maintain this support even in multi-layered DSLs.
123
+
124
+ ### Build a Pizza
125
+
126
+ Mutating (changing) an Array instance is fine, but what usually makes a good DSL is a [Builder Pattern][2].
127
+
128
+ For example, let's say you want a DSL to specify how you want to build a Pizza:
129
+
130
+ ```ruby
131
+ @sauce_level = :extra
132
+
133
+ pizza do
134
+ cheese
135
+ pepperoni
136
+ sauce @sauce_level
137
+ end
138
+ #=> #<Pizza:0x00001009dc398 @cheese=true, @pepperoni=true, @bacon=false, @sauce=:extra>
139
+ ```
140
+
141
+ And let's say we have a PizzaBuilder, which builds a Pizza like this:
142
+
143
+ ```ruby
144
+ Pizza = Struct.new(:cheese, :pepperoni, :bacon, :sauce)
145
+
146
+ class PizzaBuilder
147
+ def cheese(v=true); @cheese = v; self; end
148
+ def pepperoni(v=true); @pepperoni = v; self; end
149
+ def bacon(v=true); @bacon = v; self; end
150
+ def sauce(v=nil); @sauce = v; self; end
151
+ def build
152
+ Pizza.new(!!@cheese, !!@pepperoni, !!@bacon, @sauce)
153
+ end
154
+ end
155
+
156
+ PizzaBuilder.new.cheese.pepperoni.sauce(:extra).build
157
+ #=> #<Pizza:0x00001009dc398 @cheese=true, @pepperoni=true, @bacon=false, @sauce=:extra>
158
+ ```
159
+
160
+ Then implement your DSL like this:
161
+
162
+ ```ruby
163
+ def pizza(&block)
164
+ Docile.dsl_eval(PizzaBuilder.new, &block).build
165
+ end
166
+ ```
167
+
168
+ It's just that easy!
169
+
170
+ [2]: http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern "Builder Pattern"
171
+
172
+ ### Multi-level and Recursive DSLs
173
+
174
+ Docile is a very easy way to write a multi-level DSL in Ruby, even for
175
+ a [recursive data structure such as a tree][4]:
176
+
177
+ ```ruby
178
+ Person = Struct.new(:name, :mother, :father)
179
+
180
+ person {
181
+ name 'John Smith'
182
+ mother {
183
+ name 'Mary Smith'
184
+ }
185
+ father {
186
+ name 'Tom Smith'
187
+ mother {
188
+ name 'Jane Smith'
189
+ }
190
+ }
191
+ }
192
+
193
+ #=> #<struct Person name="John Smith",
194
+ # mother=#<struct Person name="Mary Smith", mother=nil, father=nil>,
195
+ # father=#<struct Person name="Tom Smith",
196
+ # mother=#<struct Person name="Jane Smith", mother=nil, father=nil>,
197
+ # father=nil>>
198
+ ```
199
+
200
+ See the full [person tree example][4] for details.
201
+
202
+ [4]: https://gist.github.com/ms-ati/2bb17bdf10a430faba98
203
+
204
+ ### Block parameters
205
+
206
+ Parameters can be passed to the DSL block.
207
+
208
+ Supposing you want to make some sort of cheap [Sinatra][3] knockoff:
209
+
210
+ ```ruby
211
+ @last_request = nil
212
+ respond '/path' do |request|
213
+ puts "Request received: #{request}"
214
+ @last_request = request
215
+ end
216
+
217
+ def ride bike
218
+ # Play with your new bike
219
+ end
220
+
221
+ respond '/new_bike' do |bike|
222
+ ride(bike)
223
+ end
224
+ ```
225
+
226
+ You'd put together a dispatcher something like this:
227
+
228
+ ```ruby
229
+ require 'singleton'
230
+
231
+ class DispatchScope
232
+ def a_method_you_can_call_from_inside_the_block
233
+ :useful_huh?
234
+ end
235
+ end
236
+
237
+ class MessageDispatch
238
+ include Singleton
239
+
240
+ def initialize
241
+ @responders = {}
242
+ end
243
+
244
+ def add_responder path, &block
245
+ @responders[path] = block
246
+ end
247
+
248
+ def dispatch path, request
249
+ Docile.dsl_eval(DispatchScope.new, request, &@responders[path])
250
+ end
251
+ end
252
+
253
+ def respond path, &handler
254
+ MessageDispatch.instance.add_responder path, handler
255
+ end
256
+
257
+ def send_request path, request
258
+ MessageDispatch.instance.dispatch path, request
259
+ end
260
+ ```
261
+
262
+ [3]: http://www.sinatrarb.com "Sinatra"
263
+
264
+ ### Functional-Style Immutable DSL Objects
265
+
266
+ Sometimes, you want to use an object as a DSL, but it doesn't quite fit the
267
+ [imperative](http://en.wikipedia.org/wiki/Imperative_programming) pattern shown
268
+ above.
269
+
270
+ Instead of methods like
271
+ [Array#push](http://www.ruby-doc.org/core-3.0.0/Array.html#method-i-push), which
272
+ modifies the object at hand, it has methods like
273
+ [String#reverse](http://www.ruby-doc.org/core-3.0.0/String.html#method-i-reverse),
274
+ which returns a new object without touching the original. Perhaps it's even
275
+ [frozen](http://www.ruby-doc.org/core-3.0.0/Object.html#method-i-freeze) in
276
+ order to enforce [immutability](http://en.wikipedia.org/wiki/Immutable_object).
277
+
278
+ Wouldn't it be great if we could just treat these methods as a DSL as well?
279
+
280
+ ```ruby
281
+ s = "I'm immutable!".freeze
282
+
283
+ with_immutable_string(s) do
284
+ reverse
285
+ upcase
286
+ end
287
+ #=> "!ELBATUMMI M'I"
288
+
289
+ s
290
+ #=> "I'm immutable!"
291
+ ```
292
+
293
+ No problem, just define the method `with_immutable_string` like this:
294
+
295
+ ```ruby
296
+ def with_immutable_string(str="", &block)
297
+ Docile.dsl_eval_immutable(str, &block)
298
+ end
299
+ ```
300
+
301
+ All set!
302
+
303
+ ### Accessing the block's return value
304
+
305
+ Sometimes you might want to access the return value of your provided block,
306
+ as opposed to the DSL object itself. In these cases, use
307
+ `dsl_eval_with_block_return`. It behaves exactly like `dsl_eval`, but returns
308
+ the output from executing the block, rather than the DSL object.
309
+
310
+ ```ruby
311
+ arr = []
312
+ with_array(arr) do
313
+ push "a"
314
+ push "b"
315
+ push "c"
316
+ length
317
+ end
318
+ #=> 3
319
+
320
+ arr
321
+ #=> ["a", "b", "c"]
322
+ ```
323
+
324
+ ```ruby
325
+ def with_array(arr=[], &block)
326
+ Docile.dsl_eval_with_block_return(arr, &block)
327
+ end
328
+ ```
329
+
330
+ ## Features
331
+
332
+ 1. Method lookup falls back from the DSL object to the block's context
333
+ 2. Local variable lookup falls back from the DSL object to the block's
334
+ context
335
+ 3. Instance variables are from the block's context only
336
+ 4. Nested DSL evaluation, correctly chaining method and variable handling
337
+ from the inner to the outer DSL scopes
338
+ 5. Alternatives for both imperative and functional styles of DSL objects
339
+
340
+ ## Installation
341
+
342
+ ``` bash
343
+ $ gem install docile
344
+ ```
345
+
346
+ ## Links
347
+ * [Source](https://github.com/ms-ati/docile)
348
+ * [Documentation](http://rubydoc.info/gems/docile)
349
+ * [Bug Tracker](https://github.com/ms-ati/docile/issues)
350
+
351
+ ## Status
352
+
353
+ Works on [all currently supported ruby versions](https://github.com/ms-ati/docile/blob/master/.github/workflows/main.yml),
354
+ or so [Github Actions](https://github.com/ms-ati/docile/actions)
355
+ tells us.
356
+
357
+ Used by some pretty cool gems to implement their DSLs, notably including
358
+ [SimpleCov](https://github.com/colszowka/simplecov). Keep an eye out for new
359
+ gems using Docile at the
360
+ [Ruby Toolbox](https://www.ruby-toolbox.com/projects/docile).
361
+
362
+ ## Release Policy
363
+
364
+ Docile releases follow
365
+ [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html).
366
+
367
+ ## Note on Patches/Pull Requests
368
+
369
+ * Fork the project.
370
+ * Setup your development environment with:
371
+ `gem install bundler; bundle install`
372
+ * Make your feature addition or bug fix.
373
+ * Add tests for it. This is important so I don't break it in a future version
374
+ unintentionally.
375
+ * Commit, do not mess with rakefile, version, or history.
376
+ (if you want to have your own version, that is fine but bump version in a
377
+ commit by itself I can ignore when I pull)
378
+ * Send me a pull request. Bonus points for topic branches.
379
+
380
+ ## Releasing
381
+
382
+ To make a new release of `Docile` to
383
+ [RubyGems](https://rubygems.org/gems/docile), first install the release
384
+ dependencies (e.g. `rake`) as follows:
385
+
386
+ ```shell
387
+ bundle config set --local with 'release'
388
+ bundle install
389
+ ```
390
+
391
+ Then carry out these steps:
392
+
393
+ 1. Update `HISTORY.md`:
394
+ - Add an entry for the upcoming version _x.y.z_
395
+ - Move content from _Unreleased_ to the upcoming version _x.y.z_
396
+ - Commit with title `Update HISTORY.md for x.y.z`
397
+
398
+ 2. Update `lib/docile/version.rb`
399
+ - Replace with upcoming version _x.y.z_
400
+ - Commit with title `Bump version to x.y.z`
401
+
402
+ 3. `bundle exec rake release`
403
+
404
+ ## Copyright & License
405
+
406
+ Copyright (c) 2012-2024 Marc Siegel.
407
+
408
+ Licensed under the [MIT License](http://choosealicense.com/licenses/mit/),
409
+ see [LICENSE](LICENSE) for details.
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/docile/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "docile"
7
+ s.version = Docile::VERSION
8
+ s.author = "Marc Siegel"
9
+ s.email = "marc@usainnov.com"
10
+ s.homepage = "https://ms-ati.github.io/docile/"
11
+ s.summary = "Docile keeps your Ruby DSLs tame and well-behaved."
12
+ s.description = "Docile treats the methods of a given ruby object as a DSL "\
13
+ "(domain specific language) within a given block. \n\n"\
14
+ "Killer feature: you can also reference methods, instance "\
15
+ "variables, and local variables from the original (non-DSL) "\
16
+ "context within the block. \n\n"\
17
+ "Docile releases follow Semantic Versioning as defined at "\
18
+ "semver.org."
19
+ s.license = "MIT"
20
+
21
+ # Specify oldest supported Ruby version (2.5 to support JRuby 9.2.17.0)
22
+ s.required_ruby_version = ">= 2.5.0"
23
+
24
+ # Files included in the gem
25
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ f.match(%r{^(test|spec|features)/})
27
+ end
28
+ s.require_paths = ["lib"]
29
+
30
+ s.metadata = {
31
+ "homepage_uri" => "https://ms-ati.github.io/docile/",
32
+ "changelog_uri" => "https://github.com/ms-ati/docile/blob/main/HISTORY.md",
33
+ "source_code_uri" => "https://github.com/ms-ati/docile",
34
+ "rubygems_mfa_required" => "true",
35
+ }
36
+ end
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.metadata["homepage_uri"] = spec.homepage
20
20
  spec.metadata["source_code_uri"] = spec.homepage
21
+ spec.metadata["changelog_uri"] =
22
+ "#{spec.homepage}/releases/tag/v#{spec.version}"
21
23
 
22
24
  spec.files = %w[
23
25
  LICENSE.txt
@@ -29,7 +31,6 @@ Gem::Specification.new do |spec|
29
31
  lib/drb/extserv.rb
30
32
  lib/drb/extservm.rb
31
33
  lib/drb/gw.rb
32
- lib/drb/invokemethod.rb
33
34
  lib/drb/observer.rb
34
35
  lib/drb/ssl.rb
35
36
  lib/drb/timeridconv.rb
@@ -2,7 +2,49 @@
2
2
 
3
3
  ## Master
4
4
 
5
- [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.15.0...master)
5
+ [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.18.0...master)
6
+
7
+ ## 0.18.0
8
+
9
+ [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.17.0...v0.18.0)
10
+
11
+ * Fixed verbose mode attempting to print binary SSL data by replacing it with a summary.
12
+ ([Felipe Mesquita](https://github.com/felipedmesquita), [#265](https://github.com/typhoeus/ethon/pull/265))
13
+ * Fixed `on_headers` callbacks being called once per header line instead of once for all headers.
14
+ ([Felipe Mesquita](https://github.com/felipedmesquita), [#264](https://github.com/typhoeus/ethon/pull/264))
15
+ * Stabilized test server boot on macOS by fixing IPv6/IPv4 localhost resolution and preventing orphaned processes.
16
+ ([Geremia Taglialatela](https://github.com/tagliala), [#261](https://github.com/typhoeus/ethon/pull/261))
17
+ * Added `logger` to runtime dependencies for Ruby 3.5+ compatibility.
18
+ ([Geremia Taglialatela](https://github.com/tagliala), [#259](https://github.com/typhoeus/ethon/pull/259))
19
+ * Opted-in for MFA requirement explicitly by adding `rubygems_mfa_required` metadata.
20
+ ([Geremia Taglialatela](https://github.com/tagliala), [#257](https://github.com/typhoeus/ethon/pull/257))
21
+ * Removed redundant encoding and require_relative checks.
22
+ ([Geremia Taglialatela](https://github.com/tagliala), [#258](https://github.com/typhoeus/ethon/pull/258))
23
+
24
+ ## 0.17.0
25
+
26
+ [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.16.0...v0.17.0)
27
+
28
+ * Require Ruby 2.6+ and simplify Gemfile.
29
+ ([Felipe Mesquita](https://github.com/felipedmesquita), [#255](https://github.com/typhoeus/ethon/pull/255))
30
+ * Fixed mismatched libcurl error codes in `easy_codes` array.
31
+ ([Felipe Mesquita](https://github.com/felipedmesquita), [#253](https://github.com/typhoeus/ethon/pull/253))
32
+ * Add Ruby 3.3 and 3.4, remove Ruby 2.5 from CI matrix.
33
+ ([Felipe Mesquita](https://github.com/felipedmesquita), [#252](https://github.com/typhoeus/ethon/pull/252))
34
+ * Skip test due to libcurl 8.7.x bug in CURLINFO_REQUEST_SIZE.
35
+ ([Felipe Mesquita](https://github.com/felipedmesquita), [#251](https://github.com/typhoeus/ethon/pull/251))
36
+ * Use `Rackup::Handler.default` for Rack 3 compatibility.
37
+ ([Vít Ondruch](https://github.com/voxik), [#244](https://github.com/typhoeus/ethon/pull/244))
38
+ * Add Ruby 3.1 and 3.2 to the test matrix.
39
+ ([Orien Madgwick](https://github.com/orien), [#228](https://github.com/typhoeus/ethon/pull/228))
40
+ * Remove development and test files from the gem package.
41
+ ([Orien Madgwick](https://github.com/orien), [#227](https://github.com/typhoeus/ethon/pull/227))
42
+ * Fix missing parenthesis in example.
43
+ ([Aleksey Tsalolikhin](https://github.com/atsalolikhin-spokeo), [#226](https://github.com/typhoeus/ethon/pull/226))
44
+
45
+ ## 0.16.0
46
+
47
+ [Full Changelog](https://github.com/typhoeus/ethon/compare/v0.15.0...v0.16.0)
6
48
 
7
49
  * Added `redirect_url` value to available informations and `Easy::Mirror`.
8
50
  ([Adrien Rey-Jarthon](https://github.com/jarthod)
@@ -87,7 +87,7 @@ easy.http_request("www.example.com/get", :get, { http_version: :httpv2_0 })
87
87
  easy.http_request("www.example.com/get", :get, { http_version: :httpv2_prior_knowledge })
88
88
 
89
89
  # To set the server to use http2 with https and http1 with http, send the following:
90
- easy.http_request("www.example.com/get", :get, { http_version: :httpv2_tls }
90
+ easy.http_request("www.example.com/get", :get, { http_version: :httpv2_tls })
91
91
 
92
92
  multi.add(easy)
93
93
  multi.perform
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ require 'ethon/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "ethon"
9
+ s.version = Ethon::VERSION
10
+ s.platform = Gem::Platform::RUBY
11
+ s.authors = ["Hans Hasselberg"]
12
+ s.email = ["me@hans.io"]
13
+ s.homepage = "https://github.com/typhoeus/ethon"
14
+ s.summary = "Libcurl wrapper."
15
+ s.description = "Very lightweight libcurl wrapper."
16
+
17
+ s.required_ruby_version = ">= 2.6"
18
+ s.license = 'MIT'
19
+
20
+ s.add_dependency('ffi', ['>= 1.15.0'])
21
+ s.add_dependency('logger')
22
+
23
+ s.files = Dir.chdir(__dir__) do
24
+ `git ls-files -z`.split("\x0").reject do |file|
25
+ file.start_with?(*%w[. Gemfile Guardfile Rakefile profile spec])
26
+ end
27
+ end
28
+ s.require_path = 'lib'
29
+
30
+ s.metadata = {
31
+ 'bug_tracker_uri' => 'https://github.com/typhoeus/ethon/issues',
32
+ 'changelog_uri' => "https://github.com/typhoeus/ethon/blob/v#{s.version}/CHANGELOG.md",
33
+ 'documentation_uri' => "https://www.rubydoc.info/gems/ethon/#{s.version}",
34
+ 'rubygems_mfa_required' => 'true',
35
+ 'source_code_uri' => "https://github.com/typhoeus/ethon/tree/v#{s.version}"
36
+ }
37
+ end
@@ -1,3 +1,45 @@
1
+ 1.17.4 / 2026-03-26
2
+ -------------------
3
+
4
+ Fixed:
5
+ * Fix union by-value ABI mismatch with float and double types on ARM64 and X86_64.
6
+ See #1177 and #1178 for details.
7
+ * Exclude libffi files, which are unnecessary. #1176
8
+
9
+
10
+ 1.17.3 / 2025-12-29
11
+ -------------------
12
+
13
+ Fixed:
14
+ * Opt-in for MFA requirement explicitly. #1159
15
+ * Fix type signature for FFI::AutoPointer#initialize, FFI::StructByReference#native_type and FFI::Struct#auto_ptr . #1158
16
+ * Fix function signature of function_call in FFI trampoline. #1154
17
+ It failed on `aarch64-mingw-ucrt`.
18
+ * Add workaround for segmentation faults on `aarch64-mingw-ucrt`. #1154
19
+ * Call super in `Library#freeze` . #1154
20
+ * Deny duplication of AutoPointer per #dup and #clone . #1173
21
+ They led to double free before.
22
+
23
+ Added:
24
+ * Add binary gems for Ruby-4.0, now providing binary gems for Ruby-3.0 to 4.0.
25
+ * Add msys2_mingw_dependencies for Windows Mingw for automatic installation of libffi. #1143
26
+ * Mark callback dispatcher thread as fork safe for Puma. #1156
27
+ * Add missing FFI::Platform module and LastError signatures. #1169
28
+
29
+ Removed:
30
+ * Drop fat binary gems for Ruby < 3.0
31
+ * Remove `FFI::TypesGenerator` from distributed gems. #1164
32
+ * Remove libffi build dir after install, safing some install space. #1157
33
+
34
+
35
+ 1.17.2 / 2025-04-15
36
+ -------------------
37
+
38
+ Fixed:
39
+ * #1144, #1145 Update libffi to 3.4.8 to fix installation issues on latest Macos on ARM64
40
+ * Various adjustments to run the specs cleanly on Ruby-3.5 master branch.
41
+
42
+
1
43
  1.17.1 / 2024-12-30
2
44
  -------------------
3
45
 
@@ -33,6 +33,7 @@ MyLib.puts 'Hello, World using libc!'
33
33
 
34
34
  For less minimalistic and more examples you may look at:
35
35
 
36
+ * The [documentation](https://www.rubydoc.info/gems/ffi)
36
37
  * the `samples/` folder
37
38
  * the examples on the [wiki](https://github.com/ffi/ffi/wiki)
38
39
  * the projects using FFI listed on the wiki: https://github.com/ffi/ffi/wiki/projects-using-ffi
@@ -15,13 +15,16 @@ Gem::Specification.new do |s|
15
15
  s.metadata['wiki_uri'] = 'https://github.com/ffi/ffi/wiki'
16
16
  s.metadata['source_code_uri'] = 'https://github.com/ffi/ffi/'
17
17
  s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi'
18
+ s.metadata['rubygems_mfa_required'] = 'true'
18
19
  end
19
20
  s.files = `git ls-files -z`.split("\x0").reject do |f|
20
- f =~ /^(\.|bench|gen|libtest|nbproject|spec)/
21
+ f =~ /^(\.|bench|gen|libtest|nbproject|spec|rakelib)/
21
22
  end
22
23
 
23
24
  # Add libffi git files
24
- lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
25
+ lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0").reject do |f|
26
+ f =~ /^(\.|testsuite)/
27
+ end
25
28
  # Add autoconf generated files of libffi
26
29
  lfs += %w[ compile configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ]
27
30
  # Add automake generated files of libffi
@@ -35,8 +38,6 @@ Gem::Specification.new do |s|
35
38
  s.license = 'BSD-3-Clause'
36
39
  s.require_paths << 'ext/ffi_c'
37
40
  s.required_ruby_version = '>= 2.5'
38
- s.add_development_dependency 'rake', '~> 13.0'
39
- s.add_development_dependency 'rake-compiler', '~> 1.1'
40
- s.add_development_dependency 'rake-compiler-dock', '~> 1.0'
41
- s.add_development_dependency 'rspec', '~> 2.14.1'
41
+
42
+ s.metadata['msys2_mingw_dependencies'] = 'libffi'
42
43
  end
@@ -95,7 +95,8 @@ Hashdiff.unpatch!(b, diff).should == a
95
95
  ### Options
96
96
 
97
97
  The following options are available: `:delimiter`, `:similarity`, `:strict`, `:ignore_keys`,
98
- `:indifferent`, `:numeric_tolerance`, `:strip`, `:case_insensitive`, `:array_path` and `:use_lcs`
98
+ `:indifferent`, `:numeric_tolerance`, `:strip`, `:case_insensitive`, `:array_path`,
99
+ `:use_lcs`, and `:preserve_key_order`
99
100
 
100
101
  #### `:delimiter`
101
102
 
@@ -235,6 +236,30 @@ diff = Hashdiff.diff(a, b, use_lcs: false)
235
236
  diff.should == [["~", "x[1]", 1, 2], ["+", "x[3]", 3]]
236
237
  ```
237
238
 
239
+ #### `:preserve_key_order`
240
+
241
+ By default, the change set is ordered by operation type: deletions (-) first, then updates (~), and finally additions (+).
242
+ Within each operation group, keys are sorted alphabetically:
243
+
244
+ ```ruby
245
+ a = {d: 1, c: 1, a: 1}
246
+ b = {d: 2, b: 2, a: 2}
247
+
248
+ diff = Hashdiff.diff(a, b)
249
+ diff.should == [["-", "c", 1], ["~", "a", 1, 2], ["~", "d", 1, 2], ["+", "b", 2]]
250
+ ```
251
+
252
+ Setting :preserve_key_order to true processes keys in the order they appear in the first hash.
253
+ Keys that only exist in the second hash are appended in their original order:
254
+
255
+ ```ruby
256
+ a = {d: 1, c: 1, a: 1}
257
+ b = {d: 2, b: 2, a: 2}
258
+
259
+ diff = Hashdiff.diff(a, b, preserve_key_order: true)
260
+ diff.should == [["~", "d", 1, 2], ["-", "c", 1], ["~", "a", 1, 2], ["+", "b", 2]]
261
+ ```
262
+
238
263
  #### Specifying a custom comparison method
239
264
 
240
265
  It's possible to specify how the values of a key should be compared.