iron_admin 0.5.0 → 0.6.0
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.
- checksums.yaml +4 -4
- data/app/assets/config/iron_admin_manifest.js +12 -0
- data/app/components/iron_admin/dashboards/metric_card_component.html.haml +8 -3
- data/app/components/iron_admin/dashboards/metric_card_component.rb +21 -1
- data/app/components/iron_admin/form/belongs_to_component.rb +60 -6
- data/app/components/iron_admin/form/nested_form_component.html.haml +28 -0
- data/app/components/iron_admin/form/nested_form_component.rb +81 -0
- data/app/components/iron_admin/resources/data_table_component.html.haml +1 -1
- data/app/components/iron_admin/resources/data_table_component.rb +6 -0
- data/app/components/iron_admin/resources/show_field_component.rb +2 -0
- data/app/controllers/iron_admin/application_controller.rb +32 -1
- data/app/controllers/iron_admin/concerns/action_executable.rb +44 -0
- data/app/controllers/iron_admin/concerns/filterable.rb +84 -0
- data/app/controllers/iron_admin/concerns/json_params_coercion.rb +67 -0
- data/app/controllers/iron_admin/concerns/nested_permittable.rb +36 -0
- data/app/controllers/iron_admin/concerns/scopeable.rb +84 -0
- data/app/controllers/iron_admin/concerns/searchable.rb +13 -16
- data/app/controllers/iron_admin/exports_controller.rb +15 -11
- data/app/controllers/iron_admin/imports_controller.rb +83 -0
- data/app/controllers/iron_admin/live_controller.rb +12 -0
- data/app/controllers/iron_admin/resources_controller.rb +118 -117
- data/app/controllers/iron_admin/search_controller.rb +5 -5
- data/app/controllers/iron_admin/tools_controller.rb +63 -4
- data/app/helpers/iron_admin/application_helper.rb +33 -14
- data/app/helpers/iron_admin/field_display_helper.rb +160 -1
- data/app/javascript/iron_admin/controllers/cp_nested_form_controller.js +113 -0
- data/app/javascript/iron_admin/controllers/filter_operator_controller.js +10 -0
- data/app/javascript/iron_admin/index.js +4 -0
- data/app/views/iron_admin/dashboard/index.html.haml +7 -2
- data/app/views/iron_admin/form/_nested_row.html.haml +70 -0
- data/app/views/iron_admin/imports/new.html.haml +27 -0
- data/app/views/iron_admin/imports/preview.html.haml +31 -0
- data/app/views/iron_admin/resources/_form.html.haml +81 -5
- data/app/views/iron_admin/resources/action_form.html.haml +62 -0
- data/app/views/iron_admin/resources/bulk_action_form.html.haml +62 -0
- data/app/views/iron_admin/resources/index.html.haml +60 -18
- data/app/views/iron_admin/tools/action_form.html.haml +57 -0
- data/app/views/iron_admin/tools/show.html.haml +20 -1
- data/config/importmap.rb +2 -0
- data/config/locales/en.yml +36 -0
- data/config/routes.rb +7 -0
- data/docs/components/filter-components.md +60 -0
- data/docs/getting-started/quick-start.md +17 -1
- data/docs/guides/authentication.md +7 -6
- data/docs/guides/custom-adapters.md +628 -0
- data/docs/guides/extending.md +132 -3
- data/docs/guides/fields.md +1 -1
- data/docs/guides/resources.md +78 -2
- data/docs/guides/troubleshooting.md +29 -0
- data/docs/reference/routes.md +10 -0
- data/lib/generators/iron_admin/install/install_generator.rb +28 -4
- data/lib/generators/iron_admin/install_audit/install_audit_generator.rb +26 -10
- data/lib/iron_admin/action_field.rb +56 -0
- data/lib/iron_admin/adapters/active_record.rb +237 -0
- data/lib/iron_admin/adapters/base.rb +340 -0
- data/lib/iron_admin/adapters/http/column_descriptor.rb +10 -0
- data/lib/iron_admin/adapters/http/configuration.rb +27 -0
- data/lib/iron_admin/adapters/http/connection.rb +117 -0
- data/lib/iron_admin/adapters/http/model_proxy.rb +75 -0
- data/lib/iron_admin/adapters/http/query.rb +111 -0
- data/lib/iron_admin/adapters/http/record.rb +83 -0
- data/lib/iron_admin/adapters/http/type_inferrer.rb +51 -0
- data/lib/iron_admin/adapters/http.rb +241 -0
- data/lib/iron_admin/adapters/mongoid/association_wrapper.rb +74 -0
- data/lib/iron_admin/adapters/mongoid/column_descriptor.rb +10 -0
- data/lib/iron_admin/adapters/mongoid.rb +284 -0
- data/lib/iron_admin/adapters/registry.rb +44 -0
- data/lib/iron_admin/concerns/importable.rb +81 -0
- data/lib/iron_admin/concerns/live_updatable.rb +38 -0
- data/lib/iron_admin/concerns/nestable.rb +69 -0
- data/lib/iron_admin/concerns/soft_deletable.rb +61 -0
- data/lib/iron_admin/configuration.rb +20 -0
- data/lib/iron_admin/dashboard.rb +15 -20
- data/lib/iron_admin/engine.rb +28 -1
- data/lib/iron_admin/errors.rb +29 -0
- data/lib/iron_admin/field_inferrer.rb +61 -22
- data/lib/iron_admin/filters/active_record_query_builder.rb +63 -0
- data/lib/iron_admin/filters/base_query_builder.rb +55 -0
- data/lib/iron_admin/filters/http_query_builder.rb +39 -0
- data/lib/iron_admin/filters/mongoid_query_builder.rb +58 -0
- data/lib/iron_admin/filters/query_builder.rb +12 -0
- data/lib/iron_admin/import/column_mapper.rb +42 -0
- data/lib/iron_admin/import/import_preview.rb +10 -0
- data/lib/iron_admin/import/import_result.rb +10 -0
- data/lib/iron_admin/import/importer.rb +231 -0
- data/lib/iron_admin/import/parser/csv.rb +34 -0
- data/lib/iron_admin/import/parser/json.rb +36 -0
- data/lib/iron_admin/import/type_caster.rb +47 -0
- data/lib/iron_admin/live/broadcaster.rb +43 -0
- data/lib/iron_admin/live/poll_cache.rb +28 -0
- data/lib/iron_admin/live.rb +29 -0
- data/lib/iron_admin/nested_association.rb +15 -0
- data/lib/iron_admin/nested_attributes_validator.rb +25 -0
- data/lib/iron_admin/policy.rb +72 -13
- data/lib/iron_admin/resource.rb +148 -90
- data/lib/iron_admin/resource_registry.rb +77 -4
- data/lib/iron_admin/tool.rb +50 -0
- data/lib/iron_admin/tool_action.rb +73 -0
- data/lib/iron_admin/tool_context.rb +49 -0
- data/lib/iron_admin/version.rb +1 -1
- data/lib/iron_admin.rb +28 -0
- data/vendor/bundle/ruby/3.2.0/cache/addressable-2.9.0.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/cache/crack-1.0.1.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/cache/faraday-2.14.1.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/cache/faraday-net_http-3.4.2.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/cache/hashdiff-1.2.1.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/cache/net-http-0.9.1.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/cache/public_suffix-7.0.5.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/cache/rexml-3.4.4.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/cache/webmock-3.26.2.gem +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/bigdecimal-4.0.1/bigdecimal.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/bigdecimal-4.0.1/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/bigdecimal-4.0.1/mkmf.log +25 -25
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/date-3.5.1/date_core.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/date-3.5.1/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/date-3.5.1/mkmf.log +4 -4
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/erb-6.0.1/erb/escape.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/erb-6.0.1/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/erb-6.0.1/mkmf.log +2 -2
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/io-console-0.8.2/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/io-console-0.8.2/io/console.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/io-console-0.8.2/mkmf.log +22 -22
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/json-2.18.1/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/json-2.18.1/json/ext/generator.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/json-2.18.1/json/ext/parser.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/json-2.18.1/mkmf.log +9 -9
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/nio4r-2.7.5/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/nio4r-2.7.5/mkmf.log +12 -12
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/nio4r-2.7.5/nio4r_ext.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/prism-1.9.0/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/prism-1.9.0/mkmf.log +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/prism-1.9.0/prism/prism.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/psych-5.3.1/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/psych-5.3.1/mkmf.log +7 -7
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/psych-5.3.1/psych.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/racc-1.8.1/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/racc-1.8.1/racc/cparse.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/redcarpet-3.6.1/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/redcarpet-3.6.1/redcarpet.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/stringio-3.2.0/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/stringio-3.2.0/mkmf.log +2 -2
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/stringio-3.2.0/stringio.so +0 -0
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/websocket-driver-0.8.0/gem_make.out +6 -6
- data/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/websocket-driver-0.8.0/websocket_mask.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/CHANGELOG.md +326 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/LICENSE.txt +202 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/README.md +121 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/lib/addressable/idna/native.rb +66 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/lib/addressable/idna/pure.rb +4710 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/lib/addressable/idna.rb +26 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/lib/addressable/template.rb +1040 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/lib/addressable/uri.rb +2602 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/lib/addressable/version.rb +31 -0
- data/vendor/bundle/ruby/3.2.0/gems/addressable-2.9.0/lib/addressable.rb +4 -0
- data/vendor/bundle/ruby/3.2.0/gems/bigdecimal-4.0.1/ext/bigdecimal/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/bigdecimal-4.0.1/lib/bigdecimal.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/crack-1.0.1/History +58 -0
- data/vendor/bundle/ruby/3.2.0/gems/crack-1.0.1/LICENSE +20 -0
- data/vendor/bundle/ruby/3.2.0/gems/crack-1.0.1/README.md +43 -0
- data/vendor/bundle/ruby/3.2.0/gems/crack-1.0.1/lib/crack/json.rb +113 -0
- data/vendor/bundle/ruby/3.2.0/gems/crack-1.0.1/lib/crack/util.rb +17 -0
- data/vendor/bundle/ruby/3.2.0/gems/crack-1.0.1/lib/crack/version.rb +3 -0
- data/vendor/bundle/ruby/3.2.0/gems/crack-1.0.1/lib/crack/xml.rb +240 -0
- data/vendor/bundle/ruby/3.2.0/gems/crack-1.0.1/lib/crack.rb +8 -0
- data/vendor/bundle/ruby/3.2.0/gems/date-3.5.1/ext/date/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/date-3.5.1/lib/date_core.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/erb-6.0.1/ext/erb/escape/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/erb-6.0.1/lib/erb/escape.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/CHANGELOG.md +574 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/LICENSE.md +20 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/README.md +67 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/Rakefile +12 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/examples/client_spec.rb +119 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/examples/client_test.rb +144 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/adapter/test.rb +311 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/adapter.rb +101 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/adapter_registry.rb +30 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/connection.rb +565 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/encoders/flat_params_encoder.rb +105 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/encoders/nested_params_encoder.rb +183 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/error.rb +202 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/logging/formatter.rb +118 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/methods.rb +6 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/middleware.rb +72 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/middleware_registry.rb +83 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/options/connection_options.rb +23 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/options/env.rb +204 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/options/proxy_options.rb +38 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/options/request_options.rb +23 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/options/ssl_options.rb +76 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/options.rb +219 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/parameters.rb +5 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/rack_builder.rb +248 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/request/authorization.rb +54 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/request/instrumentation.rb +58 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/request/json.rb +70 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/request/url_encoded.rb +60 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/request.rb +139 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/response/json.rb +74 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/response/logger.rb +39 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/response/raise_error.rb +83 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/response.rb +95 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/utils/headers.rb +150 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/utils/params_hash.rb +61 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/utils.rb +121 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday/version.rb +5 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/lib/faraday.rb +158 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/external_adapters/faraday_specs_setup.rb +14 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/adapter/test_spec.rb +442 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/adapter_registry_spec.rb +28 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/adapter_spec.rb +55 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/connection_spec.rb +841 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/error_spec.rb +175 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/middleware_registry_spec.rb +31 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/middleware_spec.rb +213 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/options/env_spec.rb +76 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/options/options_spec.rb +297 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/options/proxy_options_spec.rb +79 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/options/request_options_spec.rb +19 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/params_encoders/flat_spec.rb +42 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/params_encoders/nested_spec.rb +151 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/rack_builder_spec.rb +317 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/request/authorization_spec.rb +118 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/request/instrumentation_spec.rb +74 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/request/json_spec.rb +199 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/request/url_encoded_spec.rb +93 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/request_spec.rb +110 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/response/json_spec.rb +206 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/response/logger_spec.rb +299 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/response/raise_error_spec.rb +286 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/response_spec.rb +84 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/utils/headers_spec.rb +109 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday/utils_spec.rb +120 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/faraday_spec.rb +43 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/spec_helper.rb +133 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/support/disabling_stub.rb +14 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/support/fake_safe_buffer.rb +15 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/support/faraday_middleware_subclasses.rb +18 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/support/helper_methods.rb +96 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/support/shared_examples/adapter.rb +105 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/support/shared_examples/params_encoder.rb +18 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/support/shared_examples/request_method.rb +263 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-2.14.1/spec/support/streaming_response_checker.rb +35 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-net_http-3.4.2/LICENSE.md +21 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-net_http-3.4.2/README.md +57 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-net_http-3.4.2/lib/faraday/adapter/net_http.rb +206 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-net_http-3.4.2/lib/faraday/net_http/version.rb +7 -0
- data/vendor/bundle/ruby/3.2.0/gems/faraday-net_http-3.4.2/lib/faraday/net_http.rb +10 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/Gemfile +8 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/LICENSE +19 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/README.md +323 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/Rakefile +18 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/changelog.md +127 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/hashdiff.gemspec +39 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff/compare_hashes.rb +101 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff/diff.rb +185 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff/lcs.rb +66 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff/lcs_compare_arrays.rb +32 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff/linear_compare_array.rb +159 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff/patch.rb +88 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff/util.rb +155 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff/version.rb +5 -0
- data/vendor/bundle/ruby/3.2.0/gems/hashdiff-1.2.1/lib/hashdiff.rb +10 -0
- data/vendor/bundle/ruby/3.2.0/gems/io-console-0.8.2/ext/io/console/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/io-console-0.8.2/lib/io/console.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/json-2.18.1/ext/json/ext/generator/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/json-2.18.1/ext/json/ext/parser/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/json-2.18.1/lib/json/ext/generator.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/json-2.18.1/lib/json/ext/parser.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/BSDL +22 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/COPYING +56 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/README.md +93 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/doc/net-http/examples.rdoc +31 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/doc/net-http/included_getters.rdoc +3 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/exceptions.rb +35 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/generic_request.rb +429 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/header.rb +985 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/proxy_delta.rb +17 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/request.rb +88 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/requests.rb +444 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/response.rb +739 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/responses.rb +1242 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http/status.rb +84 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/http.rb +2608 -0
- data/vendor/bundle/ruby/3.2.0/gems/net-http-0.9.1/lib/net/https.rb +23 -0
- data/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.5/ext/nio4r/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/nio4r-2.7.5/lib/nio4r_ext.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/prism-1.9.0/ext/prism/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/prism-1.9.0/lib/prism/prism.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/psych-5.3.1/ext/psych/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/psych-5.3.1/lib/psych.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/CHANGELOG.md +649 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/Gemfile +16 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/README.md +231 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/SECURITY.md +24 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/data/list.txt +16298 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/lib/public_suffix/domain.rb +235 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/lib/public_suffix/errors.rb +41 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/lib/public_suffix/list.rb +247 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/lib/public_suffix/rule.rb +350 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/lib/public_suffix/version.rb +14 -0
- data/vendor/bundle/ruby/3.2.0/gems/public_suffix-7.0.5/lib/public_suffix.rb +177 -0
- data/vendor/bundle/ruby/3.2.0/gems/racc-1.8.1/ext/racc/cparse/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/racc-1.8.1/lib/racc/cparse.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/redcarpet-3.6.1/ext/redcarpet/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/redcarpet-3.6.1/lib/redcarpet.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/NEWS.md +843 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/README.md +57 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/context.rdoc +143 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/rdoc/child.rdoc +87 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/rdoc/document.rdoc +276 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/rdoc/element.rdoc +602 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/rdoc/node.rdoc +97 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/rdoc/parent.rdoc +267 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/tocs/child_toc.rdoc +12 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/tocs/document_toc.rdoc +30 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/tocs/element_toc.rdoc +55 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/tocs/master_toc.rdoc +135 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/tocs/node_toc.rdoc +16 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tasks/tocs/parent_toc.rdoc +25 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/doc/rexml/tutorial.rdoc +1358 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/attlistdecl.rb +63 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/attribute.rb +210 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/cdata.rb +68 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/child.rb +96 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/comment.rb +80 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/doctype.rb +306 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/document.rb +471 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/dtd/attlistdecl.rb +11 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/dtd/dtd.rb +47 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/dtd/elementdecl.rb +18 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/dtd/entitydecl.rb +57 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/dtd/notationdecl.rb +40 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/element.rb +2578 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/encoding.rb +48 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/entity.rb +142 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/formatters/default.rb +116 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/formatters/pretty.rb +142 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/formatters/transitive.rb +58 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/functions.rb +446 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/instruction.rb +79 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/light/node.rb +188 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/namespace.rb +63 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/node.rb +80 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/output.rb +30 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parent.rb +166 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parseexception.rb +53 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parsers/baseparser.rb +949 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parsers/lightparser.rb +59 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parsers/pullparser.rb +213 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parsers/sax2parser.rb +270 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parsers/streamparser.rb +67 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parsers/treeparser.rb +89 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parsers/ultralightparser.rb +57 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/parsers/xpathparser.rb +739 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/quickpath.rb +267 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/rexml.rb +39 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/sax2listener.rb +98 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/security.rb +28 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/source.rb +388 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/streamlistener.rb +93 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/text.rb +420 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/undefinednamespaceexception.rb +9 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/validation/relaxng.rb +540 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/validation/validation.rb +144 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/validation/validationexception.rb +10 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/xmldecl.rb +130 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/xmltokens.rb +85 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/xpath.rb +70 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml/xpath_parser.rb +980 -0
- data/vendor/bundle/ruby/3.2.0/gems/rexml-3.4.4/lib/rexml.rb +3 -0
- data/vendor/bundle/ruby/3.2.0/gems/stringio-3.2.0/ext/stringio/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/stringio-3.2.0/lib/stringio.so +0 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/CHANGELOG.md +2148 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/LICENSE +20 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/README.md +1229 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/api.rb +111 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/assertion_failure.rb +13 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/callback_registry.rb +37 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/config.rb +20 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/cucumber.rb +12 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/deprecation.rb +11 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/errors.rb +19 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +228 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/curb_adapter.rb +354 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +239 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/excon_adapter.rb +167 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/http_lib_adapter.rb +9 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +21 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/http_rb/client.rb +17 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/http_rb/request.rb +28 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/http_rb/response.rb +95 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/http_rb/streamer.rb +44 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/http_rb/webmock.rb +77 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/http_rb_adapter.rb +39 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/httpclient_adapter.rb +260 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/manticore_adapter.rb +147 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/net_http.rb +310 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/net_http_response.rb +36 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/patron_adapter.rb +132 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +190 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/matchers/any_arg_matcher.rb +15 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/matchers/hash_argument_matcher.rb +23 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/matchers/hash_excluding_matcher.rb +17 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/matchers/hash_including_matcher.rb +19 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/minitest.rb +43 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/rack_response.rb +73 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/request_body_diff.rb +66 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/request_execution_verifier.rb +79 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/request_pattern.rb +428 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/request_registry.rb +37 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/request_signature.rb +56 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/request_signature_snippet.rb +63 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/request_stub.rb +134 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/response.rb +161 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/responses_sequence.rb +42 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/rspec/matchers/request_pattern_matcher.rb +80 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/rspec/matchers/webmock_matcher.rb +69 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/rspec/matchers.rb +29 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/rspec.rb +44 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/stub_registry.rb +84 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/stub_request_snippet.rb +40 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/test_unit.rb +22 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/hash_counter.rb +45 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/hash_keys_stringifier.rb +27 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/hash_validator.rb +19 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/headers.rb +77 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/parsers/json.rb +72 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/parsers/parse_error.rb +7 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/parsers/xml.rb +16 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/query_mapper.rb +283 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/uri.rb +113 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/values_stringifier.rb +22 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/util/version_checker.rb +113 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/version.rb +5 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock/webmock.rb +175 -0
- data/vendor/bundle/ruby/3.2.0/gems/webmock-3.26.2/lib/webmock.rb +61 -0
- data/vendor/bundle/ruby/3.2.0/gems/websocket-driver-0.8.0/ext/websocket-driver/Makefile +3 -3
- data/vendor/bundle/ruby/3.2.0/gems/websocket-driver-0.8.0/lib/websocket_mask.so +0 -0
- data/vendor/bundle/ruby/3.2.0/specifications/addressable-2.9.0.gemspec +29 -0
- data/vendor/bundle/ruby/3.2.0/specifications/crack-1.0.1.gemspec +27 -0
- data/vendor/bundle/ruby/3.2.0/specifications/faraday-2.14.1.gemspec +0 -0
- data/vendor/bundle/ruby/3.2.0/specifications/faraday-net_http-3.4.2.gemspec +26 -0
- data/vendor/bundle/ruby/3.2.0/specifications/hashdiff-1.2.1.gemspec +30 -0
- data/vendor/bundle/ruby/3.2.0/specifications/net-http-0.9.1.gemspec +27 -0
- data/vendor/bundle/ruby/3.2.0/specifications/public_suffix-7.0.5.gemspec +24 -0
- data/vendor/bundle/ruby/3.2.0/specifications/rexml-3.4.4.gemspec +25 -0
- data/vendor/bundle/ruby/3.2.0/specifications/webmock-3.26.2.gemspec +44 -0
- metadata +377 -2
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hashdiff
|
|
4
|
+
# Best diff two objects, which tries to generate the smallest change set using different similarity values.
|
|
5
|
+
#
|
|
6
|
+
# Hashdiff.best_diff is useful in case of comparing two objects which include similar hashes in arrays.
|
|
7
|
+
#
|
|
8
|
+
# @param [Array, Hash] obj1
|
|
9
|
+
# @param [Array, Hash] obj2
|
|
10
|
+
# @param [Hash] options the options to use when comparing
|
|
11
|
+
# * :strict (Boolean) [true] whether numeric values will be compared on type as well as value. Set to false to allow comparing Integer, Float, BigDecimal to each other
|
|
12
|
+
# * :ignore_keys (Symbol, String or Array) [[]] a list of keys to ignore. No comparison is made for the specified key(s) in either hash
|
|
13
|
+
# * :indifferent (Boolean) [false] whether to treat hash keys indifferently. Set to true to ignore differences between symbol keys (ie. {a: 1} ~= {'a' => 1})
|
|
14
|
+
# * :delimiter (String) ['.'] the delimiter used when returning nested key references
|
|
15
|
+
# * :numeric_tolerance (Numeric) [0] should be a positive numeric value. Value by which numeric differences must be greater than. By default, numeric values are compared exactly; with the :tolerance option, the difference between numeric values must be greater than the given value.
|
|
16
|
+
# * :strip (Boolean) [false] whether or not to call #strip on strings before comparing
|
|
17
|
+
# * :array_path (Boolean) [false] whether to return the path references for nested values in an array, can be used for patch compatibility with non string keys.
|
|
18
|
+
# * :use_lcs (Boolean) [true] whether or not to use an implementation of the Longest common subsequence algorithm for comparing arrays, produces better diffs but is slower.
|
|
19
|
+
# * :preserve_key_order (Boolean) [false] If false, operations are grouped by type (-, ~, then +) then by hash key alphabetically. If true, preserves the original key order from the first hash and appends new keys from the second hash in order.
|
|
20
|
+
#
|
|
21
|
+
# @yield [path, value1, value2] Optional block is used to compare each value, instead of default #==. If the block returns value other than true of false, then other specified comparison options will be used to do the comparison.
|
|
22
|
+
#
|
|
23
|
+
# @return [Array] an array of changes.
|
|
24
|
+
# e.g. [[ '+', 'a.b', '45' ], [ '-', 'a.c', '5' ], [ '~', 'a.x', '45', '63']]
|
|
25
|
+
#
|
|
26
|
+
# @example
|
|
27
|
+
# a = {'x' => [{'a' => 1, 'c' => 3, 'e' => 5}, {'y' => 3}]}
|
|
28
|
+
# b = {'x' => [{'a' => 1, 'b' => 2, 'e' => 5}] }
|
|
29
|
+
# diff = Hashdiff.best_diff(a, b)
|
|
30
|
+
# diff.should == [['-', 'x[0].c', 3], ['+', 'x[0].b', 2], ['-', 'x[1].y', 3], ['-', 'x[1]', {}]]
|
|
31
|
+
#
|
|
32
|
+
# @since 0.0.1
|
|
33
|
+
def self.best_diff(obj1, obj2, options = {}, &block)
|
|
34
|
+
options[:comparison] = block if block_given?
|
|
35
|
+
|
|
36
|
+
opts = { similarity: 0.3 }.merge!(options)
|
|
37
|
+
diffs1 = diff(obj1, obj2, opts)
|
|
38
|
+
count1 = count_diff diffs1
|
|
39
|
+
|
|
40
|
+
opts = { similarity: 0.5 }.merge!(options)
|
|
41
|
+
diffs2 = diff(obj1, obj2, opts)
|
|
42
|
+
count2 = count_diff diffs2
|
|
43
|
+
|
|
44
|
+
opts = { similarity: 0.8 }.merge!(options)
|
|
45
|
+
diffs3 = diff(obj1, obj2, opts)
|
|
46
|
+
count3 = count_diff diffs3
|
|
47
|
+
|
|
48
|
+
count, diffs = count1 < count2 ? [count1, diffs1] : [count2, diffs2]
|
|
49
|
+
count < count3 ? diffs : diffs3
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Compute the diff of two hashes or arrays
|
|
53
|
+
#
|
|
54
|
+
# @param [Array, Hash] obj1
|
|
55
|
+
# @param [Array, Hash] obj2
|
|
56
|
+
# @param [Hash] options the options to use when comparing
|
|
57
|
+
# * :strict (Boolean) [true] whether numeric values will be compared on type as well as value. Set to false to allow comparing Integer, Float, BigDecimal to each other
|
|
58
|
+
# * :ignore_keys (Symbol, String or Array) [[]] a list of keys to ignore. No comparison is made for the specified key(s) in either hash
|
|
59
|
+
# * :indifferent (Boolean) [false] whether to treat hash keys indifferently. Set to true to ignore differences between symbol keys (ie. {a: 1} ~= {'a' => 1})
|
|
60
|
+
# * :similarity (Numeric) [0.8] should be between (0, 1]. Meaningful if there are similar hashes in arrays. See {best_diff}.
|
|
61
|
+
# * :delimiter (String) ['.'] the delimiter used when returning nested key references
|
|
62
|
+
# * :numeric_tolerance (Numeric) [0] should be a positive numeric value. Value by which numeric differences must be greater than. By default, numeric values are compared exactly; with the :tolerance option, the difference between numeric values must be greater than the given value.
|
|
63
|
+
# * :strip (Boolean) [false] whether or not to call #strip on strings before comparing
|
|
64
|
+
# * :array_path (Boolean) [false] whether to return the path references for nested values in an array, can be used for patch compatibility with non string keys.
|
|
65
|
+
# * :use_lcs (Boolean) [true] whether or not to use an implementation of the Longest common subsequence algorithm for comparing arrays, produces better diffs but is slower.
|
|
66
|
+
# * :preserve_key_order (Boolean) [false] If false, operations are grouped by type (-, ~, then +) then by hash key alphabetically. If true, preserves the original key order from the first hash and appends new keys from the second hash in order.
|
|
67
|
+
#
|
|
68
|
+
#
|
|
69
|
+
# @yield [path, value1, value2] Optional block is used to compare each value, instead of default #==. If the block returns value other than true of false, then other specified comparison options will be used to do the comparison.
|
|
70
|
+
#
|
|
71
|
+
# @return [Array] an array of changes.
|
|
72
|
+
# e.g. [[ '+', 'a.b', '45' ], [ '-', 'a.c', '5' ], [ '~', 'a.x', '45', '63']]
|
|
73
|
+
#
|
|
74
|
+
# @example
|
|
75
|
+
# a = {"a" => 1, "b" => {"b1" => 1, "b2" =>2}}
|
|
76
|
+
# b = {"a" => 1, "b" => {}}
|
|
77
|
+
#
|
|
78
|
+
# diff = Hashdiff.diff(a, b)
|
|
79
|
+
# diff.should == [['-', 'b.b1', 1], ['-', 'b.b2', 2]]
|
|
80
|
+
#
|
|
81
|
+
# @since 0.0.1
|
|
82
|
+
def self.diff(obj1, obj2, options = {}, &block)
|
|
83
|
+
opts = {
|
|
84
|
+
prefix: '',
|
|
85
|
+
similarity: 0.8,
|
|
86
|
+
delimiter: '.',
|
|
87
|
+
strict: true,
|
|
88
|
+
ignore_keys: [],
|
|
89
|
+
indifferent: false,
|
|
90
|
+
strip: false,
|
|
91
|
+
numeric_tolerance: 0,
|
|
92
|
+
array_path: false,
|
|
93
|
+
use_lcs: true,
|
|
94
|
+
preserve_key_order: false
|
|
95
|
+
}.merge!(options)
|
|
96
|
+
|
|
97
|
+
opts[:prefix] = [] if opts[:array_path] && opts[:prefix] == ''
|
|
98
|
+
|
|
99
|
+
opts[:ignore_keys] = [*opts[:ignore_keys]]
|
|
100
|
+
|
|
101
|
+
opts[:comparison] = block if block_given?
|
|
102
|
+
|
|
103
|
+
# prefer to compare with provided block
|
|
104
|
+
result = custom_compare(opts[:comparison], opts[:prefix], obj1, obj2)
|
|
105
|
+
return result if result
|
|
106
|
+
|
|
107
|
+
return [] if obj1.nil? && obj2.nil?
|
|
108
|
+
|
|
109
|
+
return [['~', opts[:prefix], obj1, obj2]] if obj1.nil? || obj2.nil?
|
|
110
|
+
|
|
111
|
+
return [['~', opts[:prefix], obj1, obj2]] unless comparable?(obj1, obj2, opts[:strict])
|
|
112
|
+
|
|
113
|
+
return LcsCompareArrays.call(obj1, obj2, opts) if obj1.is_a?(Array) && opts[:use_lcs]
|
|
114
|
+
|
|
115
|
+
return LinearCompareArray.call(obj1, obj2, opts) if obj1.is_a?(Array) && !opts[:use_lcs]
|
|
116
|
+
|
|
117
|
+
return CompareHashes.call(obj1, obj2, opts) if obj1.is_a?(Hash)
|
|
118
|
+
|
|
119
|
+
return [] if compare_values(obj1, obj2, opts)
|
|
120
|
+
|
|
121
|
+
[['~', opts[:prefix], obj1, obj2]]
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# @private
|
|
125
|
+
#
|
|
126
|
+
# diff array using LCS algorithm
|
|
127
|
+
def self.diff_array_lcs(arraya, arrayb, options = {})
|
|
128
|
+
return [] if arraya.empty? && arrayb.empty?
|
|
129
|
+
|
|
130
|
+
change_set = []
|
|
131
|
+
|
|
132
|
+
if arraya.empty?
|
|
133
|
+
arrayb.each_index do |index|
|
|
134
|
+
change_set << ['+', index, arrayb[index]]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
return change_set
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
if arrayb.empty?
|
|
141
|
+
arraya.each_index do |index|
|
|
142
|
+
i = arraya.size - index - 1
|
|
143
|
+
change_set << ['-', i, arraya[i]]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
return change_set
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
opts = {
|
|
150
|
+
prefix: '',
|
|
151
|
+
similarity: 0.8,
|
|
152
|
+
delimiter: '.'
|
|
153
|
+
}.merge!(options)
|
|
154
|
+
|
|
155
|
+
links = lcs(arraya, arrayb, opts)
|
|
156
|
+
|
|
157
|
+
# yield common
|
|
158
|
+
yield links if block_given?
|
|
159
|
+
|
|
160
|
+
# padding the end
|
|
161
|
+
links << [arraya.size, arrayb.size]
|
|
162
|
+
|
|
163
|
+
last_x = -1
|
|
164
|
+
last_y = -1
|
|
165
|
+
links.each do |pair|
|
|
166
|
+
x, y = pair
|
|
167
|
+
|
|
168
|
+
# remove from a, beginning from the end
|
|
169
|
+
(x > last_x + 1) && (x - last_x - 2).downto(0).each do |i|
|
|
170
|
+
change_set << ['-', last_y + i + 1, arraya[i + last_x + 1]]
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# add from b, beginning from the head
|
|
174
|
+
(y > last_y + 1) && 0.upto(y - last_y - 2).each do |i|
|
|
175
|
+
change_set << ['+', last_y + i + 1, arrayb[i + last_y + 1]]
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# update flags
|
|
179
|
+
last_x = x
|
|
180
|
+
last_y = y
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
change_set
|
|
184
|
+
end
|
|
185
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hashdiff
|
|
4
|
+
# @private
|
|
5
|
+
#
|
|
6
|
+
# caculate array difference using LCS algorithm
|
|
7
|
+
# http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
|
|
8
|
+
def self.lcs(arraya, arrayb, options = {})
|
|
9
|
+
return [] if arraya.empty? || arrayb.empty?
|
|
10
|
+
|
|
11
|
+
opts = { similarity: 0.8 }.merge!(options)
|
|
12
|
+
|
|
13
|
+
opts[:prefix] = prefix_append_array_index(opts[:prefix], '*', opts)
|
|
14
|
+
|
|
15
|
+
a_start = b_start = 0
|
|
16
|
+
a_finish = arraya.size - 1
|
|
17
|
+
b_finish = arrayb.size - 1
|
|
18
|
+
vector = []
|
|
19
|
+
|
|
20
|
+
lcs = []
|
|
21
|
+
(b_start..b_finish).each do |bi|
|
|
22
|
+
lcs[bi] = []
|
|
23
|
+
(a_start..a_finish).each do |ai|
|
|
24
|
+
if similar?(arraya[ai], arrayb[bi], opts)
|
|
25
|
+
topleft = (ai > 0) && (bi > 0) ? lcs[bi - 1][ai - 1][1] : 0
|
|
26
|
+
lcs[bi][ai] = [:topleft, topleft + 1]
|
|
27
|
+
elsif (top = bi > 0 ? lcs[bi - 1][ai][1] : 0)
|
|
28
|
+
left = ai > 0 ? lcs[bi][ai - 1][1] : 0
|
|
29
|
+
count = top > left ? top : left
|
|
30
|
+
|
|
31
|
+
direction = if top > left
|
|
32
|
+
:top
|
|
33
|
+
elsif top < left
|
|
34
|
+
:left
|
|
35
|
+
elsif bi.zero?
|
|
36
|
+
:top
|
|
37
|
+
elsif ai.zero?
|
|
38
|
+
:left
|
|
39
|
+
else
|
|
40
|
+
:both
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
lcs[bi][ai] = [direction, count]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
x = a_finish
|
|
49
|
+
y = b_finish
|
|
50
|
+
while (x >= 0) && (y >= 0) && (lcs[y][x][1] > 0)
|
|
51
|
+
if lcs[y][x][0] == :both
|
|
52
|
+
x -= 1
|
|
53
|
+
elsif lcs[y][x][0] == :topleft
|
|
54
|
+
vector.insert(0, [x, y])
|
|
55
|
+
x -= 1
|
|
56
|
+
y -= 1
|
|
57
|
+
elsif lcs[y][x][0] == :top
|
|
58
|
+
y -= 1
|
|
59
|
+
elsif lcs[y][x][0] == :left
|
|
60
|
+
x -= 1
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
vector
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hashdiff
|
|
4
|
+
# @private
|
|
5
|
+
# Used to compare arrays using the lcs algorithm
|
|
6
|
+
class LcsCompareArrays
|
|
7
|
+
class << self
|
|
8
|
+
def call(obj1, obj2, opts = {})
|
|
9
|
+
result = []
|
|
10
|
+
|
|
11
|
+
changeset = Hashdiff.diff_array_lcs(obj1, obj2, opts) do |lcs|
|
|
12
|
+
# use a's index for similarity
|
|
13
|
+
lcs.each do |pair|
|
|
14
|
+
prefix = Hashdiff.prefix_append_array_index(opts[:prefix], pair[0], opts)
|
|
15
|
+
|
|
16
|
+
result.concat(Hashdiff.diff(obj1[pair[0]], obj2[pair[1]], opts.merge(prefix: prefix)))
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
changeset.each do |change|
|
|
21
|
+
next if change[0] != '-' && change[0] != '+'
|
|
22
|
+
|
|
23
|
+
change_key = Hashdiff.prefix_append_array_index(opts[:prefix], change[1], opts)
|
|
24
|
+
|
|
25
|
+
result << [change[0], change_key, change[2]]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
result
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hashdiff
|
|
4
|
+
# @private
|
|
5
|
+
#
|
|
6
|
+
# Used to compare arrays in a linear complexity, which produces longer diffs
|
|
7
|
+
# than using the lcs algorithm but is considerably faster
|
|
8
|
+
class LinearCompareArray
|
|
9
|
+
def self.call(old_array, new_array, options = {})
|
|
10
|
+
instance = new(old_array, new_array, options)
|
|
11
|
+
instance.call
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call
|
|
15
|
+
return [] if old_array.empty? && new_array.empty?
|
|
16
|
+
|
|
17
|
+
self.old_index = 0
|
|
18
|
+
self.new_index = 0
|
|
19
|
+
# by comparing the array lengths we can expect that a number of items
|
|
20
|
+
# are either added or removed
|
|
21
|
+
self.expected_additions = new_array.length - old_array.length
|
|
22
|
+
|
|
23
|
+
loop do
|
|
24
|
+
if extra_items_in_old_array?
|
|
25
|
+
append_deletion(old_array[old_index], old_index)
|
|
26
|
+
elsif extra_items_in_new_array?
|
|
27
|
+
append_addition(new_array[new_index], new_index)
|
|
28
|
+
else
|
|
29
|
+
compare_at_index
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
self.old_index = old_index + 1
|
|
33
|
+
self.new_index = new_index + 1
|
|
34
|
+
break if iterated_through_both_arrays?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
changes
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
attr_reader :old_array, :new_array, :options, :additions, :deletions, :differences
|
|
43
|
+
attr_accessor :old_index, :new_index, :expected_additions
|
|
44
|
+
|
|
45
|
+
def initialize(old_array, new_array, options)
|
|
46
|
+
@old_array = old_array
|
|
47
|
+
@new_array = new_array
|
|
48
|
+
@options = { prefix: '' }.merge!(options)
|
|
49
|
+
|
|
50
|
+
@additions = []
|
|
51
|
+
@deletions = []
|
|
52
|
+
@differences = []
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def extra_items_in_old_array?
|
|
56
|
+
old_index < old_array.length && new_index >= new_array.length
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def extra_items_in_new_array?
|
|
60
|
+
new_index < new_array.length && old_index >= old_array.length
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def iterated_through_both_arrays?
|
|
64
|
+
old_index >= old_array.length && new_index >= new_array.length
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def compare_at_index
|
|
68
|
+
difference = item_difference(old_array[old_index], new_array[new_index], old_index)
|
|
69
|
+
return if difference.empty?
|
|
70
|
+
|
|
71
|
+
index_after_additions = index_of_match_after_additions
|
|
72
|
+
append_addititions_before_match(index_after_additions)
|
|
73
|
+
|
|
74
|
+
index_after_deletions = index_of_match_after_deletions
|
|
75
|
+
append_deletions_before_match(index_after_deletions)
|
|
76
|
+
|
|
77
|
+
match = index_after_additions || index_after_deletions
|
|
78
|
+
|
|
79
|
+
append_differences(difference) unless match
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def item_difference(old_item, new_item, item_index)
|
|
83
|
+
prefix = Hashdiff.prefix_append_array_index(options[:prefix], item_index, options)
|
|
84
|
+
Hashdiff.diff(old_item, new_item, options.merge(prefix: prefix))
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# look ahead in the new array to see if the current item appears later
|
|
88
|
+
# thereby having new items added
|
|
89
|
+
def index_of_match_after_additions
|
|
90
|
+
return unless expected_additions > 0
|
|
91
|
+
|
|
92
|
+
(1..expected_additions).each do |i|
|
|
93
|
+
next_difference = item_difference(
|
|
94
|
+
old_array[old_index],
|
|
95
|
+
new_array[new_index + i],
|
|
96
|
+
old_index
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
return new_index + i if next_difference.empty?
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
nil
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# look ahead in the old array to see if the current item appears later
|
|
106
|
+
# thereby having items removed
|
|
107
|
+
def index_of_match_after_deletions
|
|
108
|
+
return unless expected_additions < 0
|
|
109
|
+
|
|
110
|
+
(1..(expected_additions.abs)).each do |i|
|
|
111
|
+
next_difference = item_difference(
|
|
112
|
+
old_array[old_index + i],
|
|
113
|
+
new_array[new_index],
|
|
114
|
+
old_index
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
return old_index + i if next_difference.empty?
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
nil
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def append_addititions_before_match(match_index)
|
|
124
|
+
return unless match_index
|
|
125
|
+
|
|
126
|
+
(new_index...match_index).each { |i| append_addition(new_array[i], i) }
|
|
127
|
+
self.expected_additions = expected_additions - (match_index - new_index)
|
|
128
|
+
self.new_index = match_index
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def append_deletions_before_match(match_index)
|
|
132
|
+
return unless match_index
|
|
133
|
+
|
|
134
|
+
(old_index...match_index).each { |i| append_deletion(old_array[i], i) }
|
|
135
|
+
self.expected_additions = expected_additions + (match_index - new_index)
|
|
136
|
+
self.old_index = match_index
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def append_addition(item, index)
|
|
140
|
+
key = Hashdiff.prefix_append_array_index(options[:prefix], index, options)
|
|
141
|
+
additions << ['+', key, item]
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def append_deletion(item, index)
|
|
145
|
+
key = Hashdiff.prefix_append_array_index(options[:prefix], index, options)
|
|
146
|
+
deletions << ['-', key, item]
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def append_differences(difference)
|
|
150
|
+
differences.concat(difference)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def changes
|
|
154
|
+
# this algorithm only allows there to be additions or deletions
|
|
155
|
+
# deletions are reverse so they don't change the index of earlier items
|
|
156
|
+
differences + additions + deletions.reverse
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# This module provides methods to diff two hash, patch and unpatch hash
|
|
5
|
+
#
|
|
6
|
+
module Hashdiff
|
|
7
|
+
# Apply patch to object
|
|
8
|
+
#
|
|
9
|
+
# @param [Hash, Array] obj the object to be patched, can be an Array or a Hash
|
|
10
|
+
# @param [Array] changes e.g. [[ '+', 'a.b', '45' ], [ '-', 'a.c', '5' ], [ '~', 'a.x', '45', '63']]
|
|
11
|
+
# @param [Hash] options supports following keys:
|
|
12
|
+
# * :delimiter (String) ['.'] delimiter string for representing nested keys in changes array
|
|
13
|
+
#
|
|
14
|
+
# @return the object after patch
|
|
15
|
+
#
|
|
16
|
+
# @since 0.0.1
|
|
17
|
+
def self.patch!(obj, changes, options = {})
|
|
18
|
+
delimiter = options[:delimiter] || '.'
|
|
19
|
+
|
|
20
|
+
changes.each do |change|
|
|
21
|
+
parts = change[1]
|
|
22
|
+
parts = decode_property_path(parts, delimiter) unless parts.is_a?(Array)
|
|
23
|
+
|
|
24
|
+
last_part = parts.last
|
|
25
|
+
|
|
26
|
+
parent_node = node(obj, parts[0, parts.size - 1])
|
|
27
|
+
|
|
28
|
+
if change[0] == '+'
|
|
29
|
+
if parent_node.is_a?(Array)
|
|
30
|
+
parent_node.insert(last_part, change[2])
|
|
31
|
+
else
|
|
32
|
+
parent_node[last_part] = change[2]
|
|
33
|
+
end
|
|
34
|
+
elsif change[0] == '-'
|
|
35
|
+
if parent_node.is_a?(Array)
|
|
36
|
+
parent_node.delete_at(last_part)
|
|
37
|
+
else
|
|
38
|
+
parent_node.delete(last_part)
|
|
39
|
+
end
|
|
40
|
+
elsif change[0] == '~'
|
|
41
|
+
parent_node[last_part] = change[3]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
obj
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Unpatch an object
|
|
49
|
+
#
|
|
50
|
+
# @param [Hash, Array] obj the object to be unpatched, can be an Array or a Hash
|
|
51
|
+
# @param [Array] changes e.g. [[ '+', 'a.b', '45' ], [ '-', 'a.c', '5' ], [ '~', 'a.x', '45', '63']]
|
|
52
|
+
# @param [Hash] options supports following keys:
|
|
53
|
+
# * :delimiter (String) ['.'] delimiter string for representing nested keys in changes array
|
|
54
|
+
#
|
|
55
|
+
# @return the object after unpatch
|
|
56
|
+
#
|
|
57
|
+
# @since 0.0.1
|
|
58
|
+
def self.unpatch!(obj, changes, options = {})
|
|
59
|
+
delimiter = options[:delimiter] || '.'
|
|
60
|
+
|
|
61
|
+
changes.reverse_each do |change|
|
|
62
|
+
parts = change[1]
|
|
63
|
+
parts = decode_property_path(parts, delimiter) unless parts.is_a?(Array)
|
|
64
|
+
|
|
65
|
+
last_part = parts.last
|
|
66
|
+
|
|
67
|
+
parent_node = node(obj, parts[0, parts.size - 1])
|
|
68
|
+
|
|
69
|
+
if change[0] == '+'
|
|
70
|
+
if parent_node.is_a?(Array)
|
|
71
|
+
parent_node.delete_at(last_part)
|
|
72
|
+
else
|
|
73
|
+
parent_node.delete(last_part)
|
|
74
|
+
end
|
|
75
|
+
elsif change[0] == '-'
|
|
76
|
+
if parent_node.is_a?(Array)
|
|
77
|
+
parent_node.insert(last_part, change[2])
|
|
78
|
+
else
|
|
79
|
+
parent_node[last_part] = change[2]
|
|
80
|
+
end
|
|
81
|
+
elsif change[0] == '~'
|
|
82
|
+
parent_node[last_part] = change[2]
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
obj
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hashdiff
|
|
4
|
+
# @private
|
|
5
|
+
#
|
|
6
|
+
# judge whether two objects are similar
|
|
7
|
+
def self.similar?(obja, objb, options = {})
|
|
8
|
+
return compare_values(obja, objb, options) if !options[:comparison] && !any_hash_or_array?(obja, objb)
|
|
9
|
+
|
|
10
|
+
count_a = count_nodes(obja)
|
|
11
|
+
count_b = count_nodes(objb)
|
|
12
|
+
|
|
13
|
+
return true if (count_a + count_b).zero?
|
|
14
|
+
|
|
15
|
+
opts = { similarity: 0.8 }.merge!(options)
|
|
16
|
+
|
|
17
|
+
diffs = count_diff diff(obja, objb, opts)
|
|
18
|
+
|
|
19
|
+
(1 - diffs / (count_a + count_b).to_f) >= opts[:similarity]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @private
|
|
23
|
+
#
|
|
24
|
+
# count node differences
|
|
25
|
+
def self.count_diff(diffs)
|
|
26
|
+
diffs.inject(0) do |sum, item|
|
|
27
|
+
old_change_count = count_nodes(item[2])
|
|
28
|
+
new_change_count = count_nodes(item[3])
|
|
29
|
+
sum + (old_change_count + new_change_count)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @private
|
|
34
|
+
#
|
|
35
|
+
# count total nodes for an object
|
|
36
|
+
def self.count_nodes(obj)
|
|
37
|
+
return 0 unless obj
|
|
38
|
+
|
|
39
|
+
count = 0
|
|
40
|
+
if obj.is_a?(Array)
|
|
41
|
+
obj.each { |e| count += count_nodes(e) }
|
|
42
|
+
elsif obj.is_a?(Hash)
|
|
43
|
+
obj.each_value { |v| count += count_nodes(v) }
|
|
44
|
+
else
|
|
45
|
+
return 1
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
count
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @private
|
|
52
|
+
#
|
|
53
|
+
# decode property path into an array
|
|
54
|
+
# @param [String] path Property-string
|
|
55
|
+
# @param [String] delimiter Property-string delimiter
|
|
56
|
+
#
|
|
57
|
+
# e.g. "a.b[3].c" => ['a', 'b', 3, 'c']
|
|
58
|
+
def self.decode_property_path(path, delimiter = '.')
|
|
59
|
+
path.split(delimiter).inject([]) do |memo, part|
|
|
60
|
+
if part =~ /^(.*)\[(\d+)\]$/
|
|
61
|
+
if !Regexp.last_match(1).empty?
|
|
62
|
+
memo + [Regexp.last_match(1), Regexp.last_match(2).to_i]
|
|
63
|
+
else
|
|
64
|
+
memo + [Regexp.last_match(2).to_i]
|
|
65
|
+
end
|
|
66
|
+
else
|
|
67
|
+
memo + [part]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @private
|
|
73
|
+
#
|
|
74
|
+
# get the node of hash by given path parts
|
|
75
|
+
def self.node(hash, parts)
|
|
76
|
+
temp = hash
|
|
77
|
+
parts.each do |part|
|
|
78
|
+
temp = temp[part]
|
|
79
|
+
end
|
|
80
|
+
temp
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @private
|
|
84
|
+
#
|
|
85
|
+
# check for equality or "closeness" within given tolerance
|
|
86
|
+
def self.compare_values(obj1, obj2, options = {})
|
|
87
|
+
if options[:numeric_tolerance].is_a?(Numeric) &&
|
|
88
|
+
obj1.is_a?(Numeric) && obj2.is_a?(Numeric)
|
|
89
|
+
return (obj1 - obj2).abs <= options[:numeric_tolerance]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
if options[:strip] == true
|
|
93
|
+
obj1 = obj1.strip if obj1.respond_to?(:strip)
|
|
94
|
+
obj2 = obj2.strip if obj2.respond_to?(:strip)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
if options[:case_insensitive] == true
|
|
98
|
+
obj1 = obj1.downcase if obj1.respond_to?(:downcase)
|
|
99
|
+
obj2 = obj2.downcase if obj2.respond_to?(:downcase)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
obj1 == obj2
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @private
|
|
106
|
+
#
|
|
107
|
+
# check if objects are comparable
|
|
108
|
+
def self.comparable?(obj1, obj2, strict = true)
|
|
109
|
+
return true if (obj1.is_a?(Array) || obj1.is_a?(Hash)) && obj2.is_a?(obj1.class)
|
|
110
|
+
return true if (obj2.is_a?(Array) || obj2.is_a?(Hash)) && obj1.is_a?(obj2.class)
|
|
111
|
+
return true if !strict && obj1.is_a?(Numeric) && obj2.is_a?(Numeric)
|
|
112
|
+
|
|
113
|
+
obj1.is_a?(obj2.class) && obj2.is_a?(obj1.class)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# @private
|
|
117
|
+
#
|
|
118
|
+
# try custom comparison
|
|
119
|
+
def self.custom_compare(method, key, obj1, obj2)
|
|
120
|
+
return unless method
|
|
121
|
+
|
|
122
|
+
res = method.call(key, obj1, obj2)
|
|
123
|
+
|
|
124
|
+
# nil != false here
|
|
125
|
+
return [['~', key, obj1, obj2]] if res == false
|
|
126
|
+
return [] if res == true
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def self.prefix_append_key(prefix, key, opts)
|
|
130
|
+
if opts[:array_path]
|
|
131
|
+
prefix + [key]
|
|
132
|
+
else
|
|
133
|
+
prefix.empty? ? key.to_s : "#{prefix}#{opts[:delimiter]}#{key}"
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def self.prefix_append_array_index(prefix, array_index, opts)
|
|
138
|
+
if opts[:array_path]
|
|
139
|
+
prefix + [array_index]
|
|
140
|
+
else
|
|
141
|
+
"#{prefix}[#{array_index}]"
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
class << self
|
|
146
|
+
private
|
|
147
|
+
|
|
148
|
+
# @private
|
|
149
|
+
#
|
|
150
|
+
# checks if both objects are Arrays or Hashes
|
|
151
|
+
def any_hash_or_array?(obja, objb)
|
|
152
|
+
obja.is_a?(Array) || obja.is_a?(Hash) || objb.is_a?(Array) || objb.is_a?(Hash)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'hashdiff/util'
|
|
4
|
+
require 'hashdiff/compare_hashes'
|
|
5
|
+
require 'hashdiff/lcs'
|
|
6
|
+
require 'hashdiff/lcs_compare_arrays'
|
|
7
|
+
require 'hashdiff/linear_compare_array'
|
|
8
|
+
require 'hashdiff/diff'
|
|
9
|
+
require 'hashdiff/patch'
|
|
10
|
+
require 'hashdiff/version'
|