rigortype 0.3.8 → 0.4.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/README.md +2 -2
- data/data/capability_roles/capability_roles.rbs +36 -0
- data/data/core_overlay/enumerable.rbs +51 -0
- data/data/core_overlay/enumerator.rbs +84 -0
- data/data/core_overlay/hash_rbs3.rbs +41 -0
- data/data/core_overlay/process.rbs +40 -0
- data/data/core_overlay/string_io.rbs +33 -0
- data/data/effects/core.yml +3 -3
- data/data/gem_overlay/activesupport/core_ext.rbs +236 -17
- data/docs/handbook/02-everyday-types.md +17 -14
- data/docs/handbook/03-narrowing.md +132 -14
- data/docs/handbook/04-tuples-and-shapes.md +8 -6
- data/docs/handbook/05-methods-and-blocks.md +1 -1
- data/docs/handbook/06-classes.md +2 -2
- data/docs/handbook/07-rbs-and-extended.md +19 -1
- data/docs/handbook/10-sorbet.md +9 -10
- data/docs/handbook/11-sig-gen.md +525 -13
- data/docs/handbook/README.md +1 -1
- data/docs/handbook/appendix-elixir.md +2 -2
- data/docs/handbook/appendix-go.md +2 -2
- data/docs/handbook/appendix-java-csharp.md +2 -2
- data/docs/handbook/appendix-mypy.md +2 -2
- data/docs/handbook/appendix-phpstan.md +1 -1
- data/docs/handbook/appendix-rust.md +1 -1
- data/docs/handbook/appendix-type-theory.md +4 -4
- data/docs/handbook/appendix-typescript.md +1 -1
- data/docs/llms.txt +2 -0
- data/docs/manual/02-cli-reference.md +95 -6
- data/docs/manual/03-configuration.md +18 -0
- data/docs/manual/04-diagnostics.md +15 -0
- data/docs/manual/07-plugins.md +15 -5
- data/docs/manual/08-skills.md +23 -2
- data/docs/manual/10-mcp-server.md +3 -2
- data/docs/manual/11-ci.md +9 -0
- data/docs/manual/15-type-protection-coverage.md +8 -0
- data/docs/manual/16-rbs-extended-annotations.md +46 -8
- data/docs/manual/18-removing-dead-code.md +10 -8
- data/docs/manual/19-effect-labels.md +10 -0
- data/docs/manual/plugins/README.md +7 -0
- data/docs/manual/plugins/rigor-actioncable.md +8 -1
- data/docs/manual/plugins/rigor-actionmailer.md +7 -0
- data/docs/manual/plugins/rigor-actionpack.md +261 -0
- data/docs/manual/plugins/rigor-active-model-serializers.md +153 -0
- data/docs/manual/plugins/rigor-activejob.md +7 -0
- data/docs/manual/plugins/rigor-activerecord.md +138 -4
- data/docs/manual/plugins/rigor-activestorage.md +8 -1
- data/docs/manual/plugins/rigor-activesupport-core-ext.md +43 -7
- data/docs/manual/plugins/rigor-grape.md +106 -0
- data/docs/manual/plugins/rigor-graphql.md +23 -2
- data/docs/manual/plugins/rigor-pundit.md +8 -1
- data/docs/manual/plugins/rigor-rails-i18n.md +10 -5
- data/docs/manual/plugins/rigor-rails-routes.md +7 -0
- data/docs/manual/plugins/rigor-rbs-inline.md +229 -1
- data/docs/manual/plugins/rigor-sidekiq.md +8 -1
- data/docs/manual/plugins/rigor-sorbet.md +21 -5
- data/exe/rigor +19 -4
- data/lib/rigor/analysis/baseline.rb +3 -3
- data/lib/rigor/analysis/check_rules/always_truthy_condition_collector.rb +1 -1
- data/lib/rigor/analysis/check_rules/dead_version_guard_arms.rb +1 -5
- data/lib/rigor/analysis/check_rules/declaration_sourced_guard.rb +167 -2
- data/lib/rigor/analysis/check_rules/ivar_write_collector.rb +10 -2
- data/lib/rigor/analysis/check_rules/lexical_method_sites.rb +189 -0
- data/lib/rigor/analysis/check_rules/main_pass_collector.rb +6 -4
- data/lib/rigor/analysis/check_rules/published_constant_guard.rb +15 -6
- data/lib/rigor/analysis/check_rules/rule_ids.rb +21 -6
- data/lib/rigor/analysis/check_rules/rule_walk.rb +41 -5
- data/lib/rigor/analysis/check_rules/self_closedness_scanner.rb +1 -1
- data/lib/rigor/analysis/check_rules/shadowed_rescue_collector.rb +1 -1
- data/lib/rigor/analysis/check_rules/source_arity.rb +323 -0
- data/lib/rigor/analysis/check_rules/special_global_setters.rb +146 -0
- data/lib/rigor/analysis/check_rules/unreachable_clause_collector.rb +38 -4
- data/lib/rigor/analysis/check_rules/void_value_use_collector.rb +0 -1
- data/lib/rigor/analysis/check_rules.rb +718 -79
- data/lib/rigor/analysis/crash_signature.rb +8 -24
- data/lib/rigor/analysis/dependency_recorder.rb +23 -0
- data/lib/rigor/analysis/dependency_source_inference/boundary_cross_reporter.rb +1 -1
- data/lib/rigor/analysis/dependency_source_inference/builder.rb +0 -2
- data/lib/rigor/analysis/dependency_source_inference/gem_resolver.rb +0 -2
- data/lib/rigor/analysis/dependency_source_inference/index.rb +5 -5
- data/lib/rigor/analysis/dependency_source_inference/return_type_heuristic.rb +1 -2
- data/lib/rigor/analysis/dependency_source_inference/walker.rb +4 -4
- data/lib/rigor/analysis/effects_cache_probe.rb +3 -4
- data/lib/rigor/analysis/erb_template_detector.rb +1 -2
- data/lib/rigor/analysis/fact_store.rb +15 -1
- data/lib/rigor/analysis/incremental.rb +42 -0
- data/lib/rigor/analysis/incremental_session.rb +117 -26
- data/lib/rigor/analysis/plugin_fact_fingerprint.rb +0 -1
- data/lib/rigor/analysis/project_scan.rb +11 -1
- data/lib/rigor/analysis/reachability/graph.rb +3 -5
- data/lib/rigor/analysis/reachability/plugin_roots.rb +5 -5
- data/lib/rigor/analysis/reachability/project_files.rb +2 -2
- data/lib/rigor/analysis/reachability/scan.rb +5 -5
- data/lib/rigor/analysis/reachability/scan_cache.rb +3 -2
- data/lib/rigor/analysis/reachability/signature_scan.rb +2 -2
- data/lib/rigor/analysis/result.rb +1 -3
- data/lib/rigor/analysis/rule_catalog.rb +131 -1
- data/lib/rigor/analysis/run_cache_key.rb +21 -12
- data/lib/rigor/analysis/run_cache_probe.rb +3 -5
- data/lib/rigor/analysis/runner/buffer_pool_dispatcher.rb +6 -8
- data/lib/rigor/analysis/runner/declaration_position.rb +1 -2
- data/lib/rigor/analysis/runner/diagnostic_aggregator.rb +340 -33
- data/lib/rigor/analysis/runner/effect_annotation_residual_pass.rb +2 -3
- data/lib/rigor/analysis/runner/effect_envelope_pass.rb +18 -14
- data/lib/rigor/analysis/runner/pool_coordinator.rb +357 -97
- data/lib/rigor/analysis/runner/project_pre_passes.rb +38 -13
- data/lib/rigor/analysis/runner/run_snapshots.rb +6 -1
- data/lib/rigor/analysis/runner.rb +407 -51
- data/lib/rigor/analysis/template_unit_collector.rb +303 -0
- data/lib/rigor/analysis/template_unit_paths.rb +91 -0
- data/lib/rigor/analysis/template_unit_positions.rb +293 -0
- data/lib/rigor/analysis/template_units.rb +399 -0
- data/lib/rigor/analysis/worker_session.rb +62 -20
- data/lib/rigor/bleeding_edge.rb +10 -24
- data/lib/rigor/builtins/hkt_builtins.rb +3 -2
- data/lib/rigor/builtins/imported_refinements.rb +159 -21
- data/lib/rigor/builtins/predefined_constant_refinements.rb +5 -7
- data/lib/rigor/builtins/regex_refinement.rb +21 -13
- data/lib/rigor/builtins/static_return_refinements.rb +7 -6
- data/lib/rigor/cache/annotation_location.rb +2 -4
- data/lib/rigor/cache/descriptor.rb +63 -20
- data/lib/rigor/cache/engine_source.rb +33 -5
- data/lib/rigor/cache/file_digest.rb +9 -1
- data/lib/rigor/cache/incremental_snapshot.rb +72 -6
- data/lib/rigor/cache/rbs_cache_producer.rb +4 -0
- data/lib/rigor/cache/rbs_class_ancestor_table.rb +0 -3
- data/lib/rigor/cache/rbs_class_type_param_names.rb +0 -3
- data/lib/rigor/cache/rbs_constant_table.rb +0 -3
- data/lib/rigor/cache/rbs_descriptor.rb +112 -14
- data/lib/rigor/cache/rbs_environment.rb +8 -4
- data/lib/rigor/cache/rbs_known_class_names.rb +0 -3
- data/lib/rigor/cache/store.rb +76 -32
- data/lib/rigor/ci_detector.rb +1 -0
- data/lib/rigor/cli/annotate_command.rb +5 -6
- data/lib/rigor/cli/check_command.rb +57 -10
- data/lib/rigor/cli/check_invocation.rb +6 -11
- data/lib/rigor/cli/check_runner_factory.rb +1 -5
- data/lib/rigor/cli/coverage_command.rb +1 -1
- data/lib/rigor/cli/coverage_mutation.rb +12 -3
- data/lib/rigor/cli/coverage_scan.rb +1 -5
- data/lib/rigor/cli/diff_command.rb +1 -1
- data/lib/rigor/cli/doc_links.rb +4 -4
- data/lib/rigor/cli/docs_command.rb +6 -6
- data/lib/rigor/cli/doctor_command.rb +85 -38
- data/lib/rigor/cli/effects_command.rb +2 -2
- data/lib/rigor/cli/effects_diff_renderer.rb +3 -3
- data/lib/rigor/cli/effects_snapshot_command.rb +1 -1
- data/lib/rigor/cli/explain_command.rb +34 -1
- data/lib/rigor/cli/fused_protection_report.rb +7 -1
- data/lib/rigor/cli/lsp_command.rb +1 -1
- data/lib/rigor/cli/mcp_command.rb +1 -1
- data/lib/rigor/cli/measurement_integrity_warning.rb +4 -5
- data/lib/rigor/cli/mutation_fork_scan.rb +6 -6
- data/lib/rigor/cli/mutation_protection_report.rb +7 -1
- data/lib/rigor/cli/plugin_command.rb +4 -4
- data/lib/rigor/cli/plugins_command.rb +2 -1
- data/lib/rigor/cli/prism_colorizer.rb +1 -2
- data/lib/rigor/cli/protection_fork_scan.rb +6 -6
- data/lib/rigor/cli/show_bleedingedge_command.rb +1 -1
- data/lib/rigor/cli/sig_gen_command.rb +212 -31
- data/lib/rigor/cli/skill_command.rb +2 -2
- data/lib/rigor/cli/skill_deep_probe.rb +4 -4
- data/lib/rigor/cli/skill_describe.rb +35 -35
- data/lib/rigor/cli/trace_command.rb +4 -4
- data/lib/rigor/cli/trace_renderer.rb +5 -6
- data/lib/rigor/cli/triage_command.rb +1 -1
- data/lib/rigor/cli/type_of_command.rb +29 -11
- data/lib/rigor/cli/type_of_renderer.rb +20 -9
- data/lib/rigor/cli/type_of_template_probe.rb +189 -0
- data/lib/rigor/cli/type_scan_command.rb +4 -4
- data/lib/rigor/cli/unused_command.rb +11 -3
- data/lib/rigor/cli/upgrade_command.rb +1 -1
- data/lib/rigor/cli.rb +89 -9
- data/lib/rigor/config_audit.rb +30 -5
- data/lib/rigor/configuration/severity_profile.rb +25 -9
- data/lib/rigor/configuration.rb +109 -7
- data/lib/rigor/effects/ancestry_recorder.rb +191 -0
- data/lib/rigor/effects/attribution.rb +12 -5
- data/lib/rigor/effects/callee_rule.rb +368 -0
- data/lib/rigor/effects/catalog.rb +7 -4
- data/lib/rigor/effects/collector.rb +11 -5
- data/lib/rigor/effects/config_envelopes.rb +15 -10
- data/lib/rigor/effects/definition_context.rb +179 -0
- data/lib/rigor/effects/definition_lines.rb +25 -6
- data/lib/rigor/effects/effect_table.rb +11 -4
- data/lib/rigor/effects/entry_points.rb +0 -2
- data/lib/rigor/effects/envelope_check.rb +9 -9
- data/lib/rigor/effects/envelope_index.rb +20 -8
- data/lib/rigor/effects/file_collection.rb +59 -5
- data/lib/rigor/effects/framework_units.rb +5 -7
- data/lib/rigor/effects/identity.rb +20 -6
- data/lib/rigor/effects/inline_anchor.rb +7 -7
- data/lib/rigor/effects/label_intent.rb +3 -4
- data/lib/rigor/effects/liskov_check.rb +8 -8
- data/lib/rigor/effects/local_ownership.rb +38 -12
- data/lib/rigor/effects/method_key.rb +22 -1
- data/lib/rigor/effects/mutation_classifier.rb +23 -12
- data/lib/rigor/effects/plugin_facts.rb +47 -37
- data/lib/rigor/effects/propagator.rb +297 -19
- data/lib/rigor/effects/registry.rb +1 -1
- data/lib/rigor/effects/scanner.rb +122 -73
- data/lib/rigor/effects/signature_sources.rb +4 -6
- data/lib/rigor/effects/snapshot.rb +12 -11
- data/lib/rigor/effects/snapshot_diff.rb +1 -1
- data/lib/rigor/effects/summary.rb +27 -4
- data/lib/rigor/effects/unit_scan.rb +393 -38
- data/lib/rigor/effects/unknown_label_check.rb +3 -8
- data/lib/rigor/effects/unknown_label_report.rb +3 -4
- data/lib/rigor/effects/visibility.rb +101 -0
- data/lib/rigor/environment/bundle_sig_discovery.rb +6 -6
- data/lib/rigor/environment/class_registry.rb +3 -1
- data/lib/rigor/environment/failure_slot.rb +2 -2
- data/lib/rigor/environment/installed_gem_set.rb +85 -0
- data/lib/rigor/environment/lockfile_resolver.rb +68 -4
- data/lib/rigor/environment/member_consistency/comparator.rb +708 -0
- data/lib/rigor/environment/member_consistency.rb +298 -0
- data/lib/rigor/environment/missing_gem_constant_index.rb +4 -4
- data/lib/rigor/environment/rbs_collection_discovery.rb +5 -5
- data/lib/rigor/environment/rbs_coverage_report.rb +5 -5
- data/lib/rigor/environment/rbs_hierarchy.rb +3 -1
- data/lib/rigor/environment/rbs_loader.rb +674 -79
- data/lib/rigor/environment.rb +174 -24
- data/lib/rigor/flow_contribution/merger.rb +0 -2
- data/lib/rigor/flow_contribution.rb +11 -13
- data/lib/rigor/hashing/xxh3.rb +264 -0
- data/lib/rigor/inference/acceptance.rb +292 -17
- data/lib/rigor/inference/block_auto_splat.rb +216 -0
- data/lib/rigor/inference/block_call_timing.rb +338 -0
- data/lib/rigor/inference/block_parameter_binder.rb +75 -30
- data/lib/rigor/inference/block_repetition.rb +71 -0
- data/lib/rigor/inference/body_fixpoint.rb +7 -6
- data/lib/rigor/inference/budget_trace.rb +3 -6
- data/lib/rigor/inference/builtins/method_catalog.rb +2 -1
- data/lib/rigor/inference/builtins/string_catalog.rb +1 -1
- data/lib/rigor/inference/captured_locals.rb +389 -18
- data/lib/rigor/inference/closure_escape_analyzer.rb +159 -17
- data/lib/rigor/inference/content_join.rb +200 -27
- data/lib/rigor/inference/coverage_scanner.rb +4 -6
- data/lib/rigor/inference/def_return_typer.rb +11 -7
- data/lib/rigor/inference/define_method_block_self.rb +64 -0
- data/lib/rigor/inference/dynamic_origin.rb +1 -1
- data/lib/rigor/inference/element_read_widening.rb +180 -0
- data/lib/rigor/inference/error_info.rb +196 -0
- data/lib/rigor/inference/expression_typer.rb +2124 -468
- data/lib/rigor/inference/external_ancestor_resolution.rb +267 -0
- data/lib/rigor/inference/fork_map.rb +5 -7
- data/lib/rigor/inference/fresh_frame_blocks.rb +127 -0
- data/lib/rigor/inference/global_write_census.rb +239 -0
- data/lib/rigor/inference/guard_rebinding.rb +447 -0
- data/lib/rigor/inference/hash_lookup_mutation.rb +88 -0
- data/lib/rigor/inference/hkt_reducer.rb +2 -3
- data/lib/rigor/inference/hkt_registry.rb +4 -7
- data/lib/rigor/inference/index_write_widening.rb +16 -7
- data/lib/rigor/inference/indexed_narrowing.rb +61 -9
- data/lib/rigor/inference/jump_targets.rb +82 -0
- data/lib/rigor/inference/last_line/implicit_self.rb +210 -0
- data/lib/rigor/inference/last_line/self_evidence.rb +329 -0
- data/lib/rigor/inference/last_line.rb +340 -0
- data/lib/rigor/inference/last_status.rb +144 -0
- data/lib/rigor/inference/macro_block_self_type.rb +168 -21
- data/lib/rigor/inference/match_rebinding/calls.rb +281 -0
- data/lib/rigor/inference/match_rebinding/frame.rb +148 -0
- data/lib/rigor/inference/match_rebinding/operands.rb +236 -0
- data/lib/rigor/inference/match_rebinding/self_calls.rb +83 -0
- data/lib/rigor/inference/match_rebinding.rb +392 -0
- data/lib/rigor/inference/method_dispatcher/alias_strict_nominals.rb +36 -0
- data/lib/rigor/inference/method_dispatcher/block_folding.rb +87 -33
- data/lib/rigor/inference/method_dispatcher/cgi_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/constant_folding.rb +305 -19
- data/lib/rigor/inference/method_dispatcher/data_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/facet_distribution.rb +147 -0
- data/lib/rigor/inference/method_dispatcher/file_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/hash_transform_keys_folding.rb +191 -0
- data/lib/rigor/inference/method_dispatcher/iterator_dispatch.rb +6 -2
- data/lib/rigor/inference/method_dispatcher/json_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/kernel_dispatch.rb +7 -1
- data/lib/rigor/inference/method_dispatcher/match_data_folding.rb +159 -0
- data/lib/rigor/inference/method_dispatcher/math_folding.rb +41 -3
- data/lib/rigor/inference/method_dispatcher/method_folding.rb +2 -5
- data/lib/rigor/inference/method_dispatcher/overload_selector.rb +165 -111
- data/lib/rigor/inference/method_dispatcher/process_folding.rb +56 -0
- data/lib/rigor/inference/method_dispatcher/proven_overload.rb +72 -0
- data/lib/rigor/inference/method_dispatcher/random_folding.rb +82 -0
- data/lib/rigor/inference/method_dispatcher/rbs_dispatch.rb +1046 -69
- data/lib/rigor/inference/method_dispatcher/receiver_affinity.rb +25 -4
- data/lib/rigor/inference/method_dispatcher/reduce_folding.rb +2 -8
- data/lib/rigor/inference/method_dispatcher/regexp_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/self_substitute.rb +142 -0
- data/lib/rigor/inference/method_dispatcher/set_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/shape_dispatch.rb +129 -54
- data/lib/rigor/inference/method_dispatcher/shellwords_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/singleton_mixin_dispatch.rb +1 -2
- data/lib/rigor/inference/method_dispatcher/struct_folding.rb +5 -6
- data/lib/rigor/inference/method_dispatcher/struct_materialization.rb +85 -4
- data/lib/rigor/inference/method_dispatcher/time_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher/universal_object_dispatch.rb +1 -2
- data/lib/rigor/inference/method_dispatcher/uri_folding.rb +1 -1
- data/lib/rigor/inference/method_dispatcher.rb +225 -25
- data/lib/rigor/inference/method_parameter_binder.rb +12 -9
- data/lib/rigor/inference/multi_target_binder.rb +341 -55
- data/lib/rigor/inference/mutation_rejoin.rb +171 -0
- data/lib/rigor/inference/mutation_widening.rb +156 -85
- data/lib/rigor/inference/narrowing.rb +835 -162
- data/lib/rigor/inference/operand_effects.rb +167 -0
- data/lib/rigor/inference/operand_walk.rb +88 -0
- data/lib/rigor/inference/optimistic_origin.rb +153 -16
- data/lib/rigor/inference/origin_lookup.rb +2 -3
- data/lib/rigor/inference/parameter_inference_collector.rb +7 -7
- data/lib/rigor/inference/pre_eval_constants.rb +6 -5
- data/lib/rigor/inference/precision_scanner.rb +3 -4
- data/lib/rigor/inference/project_method_ownership.rb +136 -0
- data/lib/rigor/inference/project_patched_methods.rb +9 -4
- data/lib/rigor/inference/project_patched_scanner.rb +10 -6
- data/lib/rigor/inference/protection_scanner.rb +1 -2
- data/lib/rigor/inference/range_constant.rb +57 -0
- data/lib/rigor/inference/rbs_type_translator.rb +49 -11
- data/lib/rigor/inference/receiver_alias.rb +93 -4
- data/lib/rigor/inference/receiver_blind_block.rb +219 -0
- data/lib/rigor/inference/refinement_mutation.rb +76 -0
- data/lib/rigor/inference/repeated_or_writes.rb +463 -0
- data/lib/rigor/inference/return_barrier.rb +54 -0
- data/lib/rigor/inference/rewrite_mutation.rb +120 -0
- data/lib/rigor/inference/scope_indexer.rb +5228 -627
- data/lib/rigor/inference/statement_evaluator.rb +3452 -595
- data/lib/rigor/inference/stored_block_call.rb +54 -0
- data/lib/rigor/inference/string_mutation.rb +97 -0
- data/lib/rigor/inference/struct_fold_safety.rb +6 -7
- data/lib/rigor/inference/synthetic_method_index.rb +1 -2
- data/lib/rigor/inference/synthetic_method_scanner.rb +4 -6
- data/lib/rigor/inference/unknown_store_widening.rb +200 -0
- data/lib/rigor/inference/unthreaded_rebinds.rb +282 -0
- data/lib/rigor/inference/version_guard.rb +28 -21
- data/lib/rigor/inference/void_origin.rb +3 -3
- data/lib/rigor/inference/void_tail_summary.rb +2 -4
- data/lib/rigor/language_server/buffer_table.rb +4 -4
- data/lib/rigor/language_server/completion_provider.rb +1 -1
- data/lib/rigor/language_server/debouncer.rb +0 -1
- data/lib/rigor/language_server/diagnostic_publisher.rb +7 -6
- data/lib/rigor/language_server/document_symbol_provider.rb +1 -1
- data/lib/rigor/language_server/folding_range_provider.rb +1 -1
- data/lib/rigor/language_server/hover_provider.rb +1 -1
- data/lib/rigor/language_server/hover_renderer.rb +4 -4
- data/lib/rigor/language_server/incremental_sync.rb +6 -6
- data/lib/rigor/language_server/project_context.rb +7 -8
- data/lib/rigor/language_server/publish_batcher.rb +2 -2
- data/lib/rigor/language_server/selection_range_provider.rb +2 -2
- data/lib/rigor/language_server/server.rb +9 -9
- data/lib/rigor/language_server/signature_help_provider.rb +1 -1
- data/lib/rigor/language_server/uri.rb +1 -1
- data/lib/rigor/mcp/server.rb +2 -1
- data/lib/rigor/plugin/base.rb +258 -26
- data/lib/rigor/plugin/box_probe.rb +91 -0
- data/lib/rigor/plugin/bundled_catalog.rb +167 -0
- data/lib/rigor/plugin/effect_attribution.rb +65 -11
- data/lib/rigor/plugin/effect_entry_points.rb +3 -3
- data/lib/rigor/plugin/fact_store.rb +6 -6
- data/lib/rigor/plugin/io_boundary.rb +93 -8
- data/lib/rigor/plugin/isolation.rb +29 -6
- data/lib/rigor/plugin/loader.rb +33 -13
- data/lib/rigor/plugin/macro/block_as_method.rb +45 -6
- data/lib/rigor/plugin/macro/heredoc_template.rb +1 -1
- data/lib/rigor/plugin/macro/trait_registry.rb +1 -1
- data/lib/rigor/plugin/manifest.rb +94 -11
- data/lib/rigor/plugin/registry.rb +76 -12
- data/lib/rigor/plugin/source_rbs_synthesis_reporter.rb +21 -4
- data/lib/rigor/plugin/template_unit.rb +196 -0
- data/lib/rigor/plugin/trust_policy.rb +2 -4
- data/lib/rigor/plugin/type_node_resolver.rb +3 -3
- data/lib/rigor/plugin.rb +1 -0
- data/lib/rigor/plugin_gap_advisory.rb +96 -0
- data/lib/rigor/project_environment.rb +138 -0
- data/lib/rigor/protection/analysis_guard.rb +93 -14
- data/lib/rigor/protection/closure_kill_oracle.rb +67 -23
- data/lib/rigor/protection/dependency_closure.rb +5 -8
- data/lib/rigor/protection/diagnostic_oracle.rb +2 -2
- data/lib/rigor/protection/discovery_seed.rb +14 -12
- data/lib/rigor/protection/kill_signature.rb +1 -4
- data/lib/rigor/protection/measurement_integrity.rb +1 -3
- data/lib/rigor/protection/mutation_cache.rb +7 -11
- data/lib/rigor/protection/mutation_scanner.rb +12 -15
- data/lib/rigor/protection/mutator.rb +2 -1
- data/lib/rigor/protection/test_suite_oracle.rb +5 -5
- data/lib/rigor/rbs_extended/conformance_checker.rb +4 -3
- data/lib/rigor/rbs_extended/envelope_scanner.rb +4 -6
- data/lib/rigor/rbs_extended/reporter.rb +36 -10
- data/lib/rigor/rbs_extended.rb +88 -21
- data/lib/rigor/reflection/constant_ancestors.rb +97 -0
- data/lib/rigor/reflection/constant_path.rb +139 -0
- data/lib/rigor/reflection.rb +93 -110
- data/lib/rigor/runtime/jit.rb +6 -8
- data/lib/rigor/scope/discovery_index.rb +165 -2
- data/lib/rigor/scope.rb +1041 -32
- data/lib/rigor/sig_gen/alias_index.rb +289 -0
- data/lib/rigor/sig_gen/classification.rb +22 -5
- data/lib/rigor/sig_gen/declaration_equivalence.rb +127 -0
- data/lib/rigor/sig_gen/effect_annotation.rb +202 -0
- data/lib/rigor/sig_gen/generator.rb +673 -53
- data/lib/rigor/sig_gen/inline_declarations.rb +184 -0
- data/lib/rigor/sig_gen/layout_index.rb +3 -4
- data/lib/rigor/sig_gen/meta_class_shape.rb +3 -5
- data/lib/rigor/sig_gen/method_candidate.rb +47 -3
- data/lib/rigor/sig_gen/observation_collector.rb +18 -16
- data/lib/rigor/sig_gen/path_mapper.rb +4 -6
- data/lib/rigor/sig_gen/rbs_validity.rb +4 -4
- data/lib/rigor/sig_gen/renderer.rb +128 -14
- data/lib/rigor/sig_gen/skip_reason_catalog.rb +154 -0
- data/lib/rigor/sig_gen/superclass_spelling.rb +27 -0
- data/lib/rigor/sig_gen/type_elaborator.rb +1 -3
- data/lib/rigor/sig_gen/write_result.rb +19 -3
- data/lib/rigor/sig_gen/writer.rb +189 -41
- data/lib/rigor/sig_gen.rb +3 -0
- data/lib/rigor/signature_path_audit.rb +153 -6
- data/lib/rigor/source/literals.rb +0 -23
- data/lib/rigor/source/node_children.rb +0 -2
- data/lib/rigor/source/node_locator.rb +5 -11
- data/lib/rigor/source/node_walker.rb +0 -6
- data/lib/rigor/source/parameter_envelope.rb +72 -0
- data/lib/rigor/source.rb +1 -0
- data/lib/rigor/triage/catalogue.rb +1 -3
- data/lib/rigor/triage.rb +3 -5
- data/lib/rigor/type/accepts_result.rb +24 -6
- data/lib/rigor/type/combinator.rb +144 -5
- data/lib/rigor/type/data_class.rb +2 -2
- data/lib/rigor/type/data_instance.rb +4 -4
- data/lib/rigor/type/difference.rb +1 -0
- data/lib/rigor/type/float_range.rb +128 -0
- data/lib/rigor/type/hash_shape.rb +6 -6
- data/lib/rigor/type/integer_range.rb +13 -8
- data/lib/rigor/type/nominal.rb +8 -2
- data/lib/rigor/type/refined.rb +4 -3
- data/lib/rigor/type/struct_class.rb +3 -3
- data/lib/rigor/type/struct_instance.rb +4 -4
- data/lib/rigor/type.rb +1 -0
- data/lib/rigor/type_node/generic.rb +1 -1
- data/lib/rigor/type_node/range_literal.rb +25 -0
- data/lib/rigor/type_node/resolver_chain.rb +1 -1
- data/lib/rigor/type_node.rb +1 -0
- data/lib/rigor/version.rb +1 -1
- data/lib/rigor.rb +1 -0
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/analyzer.rb +0 -4
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_discoverer.rb +0 -1
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/channel_index.rb +0 -2
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable/effects.rb +1 -0
- data/plugins/rigor-actioncable/lib/rigor/plugin/actioncable.rb +10 -5
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/analyzer.rb +0 -4
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_discoverer.rb +3 -5
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer/mailer_index.rb +1 -4
- data/plugins/rigor-actionmailer/lib/rigor/plugin/actionmailer.rb +14 -4
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/analyzer.rb +32 -30
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_discoverer.rb +0 -1
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_index.rb +1 -3
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/controller_scan.rb +96 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/effects.rb +65 -8
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/erb_compiler.rb +270 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/render_locals.rb +402 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/view_assigns.rb +370 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack/view_units.rb +132 -0
- data/plugins/rigor-actionpack/lib/rigor/plugin/actionpack.rb +264 -3
- data/plugins/rigor-actionpack/sig/action_controller.rbs +71 -0
- data/plugins/rigor-actionpack/sig/action_view.rbs +43 -0
- data/plugins/rigor-active-model-serializers/lib/rigor/plugin/active_model_serializers/serializer_discoverer.rb +220 -0
- data/plugins/rigor-active-model-serializers/lib/rigor/plugin/active_model_serializers/serializer_index.rb +56 -0
- data/plugins/rigor-active-model-serializers/lib/rigor/plugin/active_model_serializers.rb +263 -0
- data/plugins/rigor-active-model-serializers/lib/rigor-active-model-serializers.rb +7 -0
- data/plugins/rigor-active-model-serializers/sig/active_model_serializers.rbs +45 -0
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/analyzer.rb +0 -4
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/effects.rb +2 -1
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_discoverer.rb +0 -1
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/job_index.rb +0 -2
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob/recurring_scan.rb +1 -1
- data/plugins/rigor-activejob/lib/rigor/plugin/activejob.rb +10 -5
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/analyzer.rb +35 -3
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/effects.rb +72 -12
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_discoverer.rb +383 -7
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/model_index.rb +14 -6
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/schema_parser.rb +1 -2
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord/structure_sql_parser.rb +1 -2
- data/plugins/rigor-activerecord/lib/rigor/plugin/activerecord.rb +322 -41
- data/plugins/rigor-activerecord/sig/active_record/framework.rbs +123 -0
- data/plugins/rigor-activerecord/sig/active_record/relation.rbs +206 -31
- data/plugins/rigor-activestorage/lib/rigor/plugin/activestorage.rb +26 -14
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext/effects.rb +9 -2
- data/plugins/rigor-activesupport-core-ext/lib/rigor/plugin/activesupport_core_ext.rb +9 -2
- data/plugins/rigor-activesupport-core-ext/sig/active_support/core_ext.rbs +290 -19
- data/plugins/rigor-devise/lib/rigor/plugin/devise.rb +1 -0
- data/plugins/rigor-dry-monads/lib/rigor/plugin/dry_monads.rb +3 -0
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema/schema_scanner.rb +9 -7
- data/plugins/rigor-dry-schema/lib/rigor/plugin/dry_schema.rb +7 -3
- data/plugins/rigor-dry-struct/lib/rigor/plugin/dry_struct.rb +1 -0
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types/alias_scanner.rb +8 -6
- data/plugins/rigor-dry-types/lib/rigor/plugin/dry_types.rb +11 -7
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation/contract_scanner.rb +13 -11
- data/plugins/rigor-dry-validation/lib/rigor/plugin/dry_validation.rb +9 -4
- data/plugins/rigor-ethon/lib/rigor/plugin/ethon.rb +2 -0
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/analyzer.rb +0 -5
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_discoverer.rb +0 -1
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot/factory_index.rb +0 -1
- data/plugins/rigor-factorybot/lib/rigor/plugin/factorybot.rb +8 -1
- data/plugins/rigor-ffi/lib/rigor/plugin/ffi/types.rb +1 -1
- data/plugins/rigor-ffi/lib/rigor/plugin/ffi.rb +36 -4
- data/plugins/rigor-ffi-rzmq/lib/rigor/plugin/ffi_rzmq.rb +1 -0
- data/plugins/rigor-grape/lib/rigor/plugin/grape.rb +141 -0
- data/plugins/rigor-grape/lib/rigor-grape.rb +6 -0
- data/plugins/rigor-grape/sig/grape.rbs +263 -0
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql/type_scanner.rb +8 -6
- data/plugins/rigor-graphql/lib/rigor/plugin/graphql.rb +78 -5
- data/plugins/rigor-graphql/sig/graphql.rbs +485 -0
- data/plugins/rigor-hanami/lib/rigor/plugin/hanami.rb +1 -0
- data/plugins/rigor-mangrove/lib/rigor/plugin/mangrove.rb +2 -1
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest/assertion_analyzer.rb +2 -3
- data/plugins/rigor-minitest/lib/rigor/plugin/minitest.rb +1 -0
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/analyzer.rb +0 -5
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/authorization_scan.rb +2 -2
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_discoverer.rb +0 -1
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit/policy_index.rb +0 -1
- data/plugins/rigor-pundit/lib/rigor/plugin/pundit.rb +12 -7
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/analyzer.rb +0 -12
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_index.rb +1 -3
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n/locale_loader.rb +0 -1
- data/plugins/rigor-rails-i18n/lib/rigor/plugin/rails_i18n.rb +36 -37
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/acronyms.rb +5 -5
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/analyzer.rb +0 -10
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/devise_routes.rb +5 -3
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/doorkeeper_routes.rb +3 -2
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/grape_api_discoverer.rb +2 -2
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_discoverer.rb +2 -2
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/helper_table.rb +9 -10
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes/routes_parser.rb +2 -3
- data/plugins/rigor-rails-routes/lib/rigor/plugin/rails_routes.rb +10 -17
- data/plugins/rigor-railties/lib/rigor/plugin/railties.rb +1 -0
- data/plugins/rigor-rbnacl/lib/rigor/plugin/rbnacl.rb +13 -1
- data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline/same_line_annotations.rb +149 -0
- data/plugins/rigor-rbs-inline/lib/rigor/plugin/rbs_inline.rb +324 -18
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/analyzer.rb +0 -3
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_scope_index.rb +0 -3
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/let_type_resolver.rb +1 -5
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec/matcher_analyzer.rb +2 -3
- data/plugins/rigor-rspec/lib/rigor/plugin/rspec.rb +1 -0
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails/have_http_status_analyzer.rb +0 -3
- data/plugins/rigor-rspec-rails/lib/rigor/plugin/rspec_rails.rb +1 -0
- data/plugins/rigor-sassc/lib/rigor/plugin/sassc.rb +1 -0
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers/analyzer.rb +1 -9
- data/plugins/rigor-shoulda-matchers/lib/rigor/plugin/shoulda_matchers.rb +1 -0
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/analyzer.rb +0 -4
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/effects.rb +1 -1
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/schedule_scan.rb +2 -1
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_discoverer.rb +0 -1
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq/worker_index.rb +0 -2
- data/plugins/rigor-sidekiq/lib/rigor/plugin/sidekiq.rb +10 -5
- data/plugins/rigor-sinatra/lib/rigor/plugin/sinatra.rb +1 -0
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/absurd_recognizer.rb +2 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/assertion_recognizer.rb +1 -4
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog.rb +3 -9
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/catalog_walker.rb +4 -4
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sig_parser.rb +1 -2
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/sigil_detector.rb +3 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet/type_translator.rb +7 -5
- data/plugins/rigor-sorbet/lib/rigor/plugin/sorbet.rb +51 -6
- data/plugins/rigor-sorbet/sig/sorbet.rbs +277 -0
- data/plugins/rigor-statesman/lib/rigor/plugin/statesman.rb +1 -0
- data/sig/rigor/analysis/baseline.rbs +69 -7
- data/sig/rigor/analysis/fact_store.rbs +1 -1
- data/sig/rigor/analysis/project_scan.rbs +74 -0
- data/sig/rigor/analysis/reachability/scan_cache.rbs +12 -0
- data/sig/rigor/cache.rbs +2 -3
- data/sig/rigor/effects/config_envelopes.rbs +100 -0
- data/sig/rigor/effects/effect_table.rbs +60 -0
- data/sig/rigor/effects/envelope.rbs +97 -0
- data/sig/rigor/effects/envelope_index.rbs +33 -0
- data/sig/rigor/effects/file_collection.rbs +81 -0
- data/sig/rigor/effects/label.rbs +26 -0
- data/sig/rigor/effects/label_set.rbs +46 -0
- data/sig/rigor/effects/method_key.rbs +24 -0
- data/sig/rigor/effects/origin.rbs +50 -0
- data/sig/rigor/effects/plugin_facts.rbs +141 -0
- data/sig/rigor/effects/registry.rbs +68 -0
- data/sig/rigor/effects/summary.rbs +50 -0
- data/sig/rigor/effects/taint_cause.rbs +12 -0
- data/sig/rigor/environment.rbs +17 -10
- data/sig/rigor/inference/optimistic_origin.rbs +10 -0
- data/sig/rigor/inference.rbs +9 -14
- data/sig/rigor/plugin/additional_initializer.rbs +36 -0
- data/sig/rigor/plugin/base.rbs +30 -7
- data/sig/rigor/plugin/effect_ancestry.rbs +27 -0
- data/sig/rigor/plugin/effect_attribution.rbs +66 -0
- data/sig/rigor/plugin/effect_edge.rbs +33 -0
- data/sig/rigor/plugin/effect_entry_points.rbs +25 -0
- data/sig/rigor/plugin/io_boundary.rbs +4 -0
- data/sig/rigor/plugin/loader.rbs +3 -3
- data/sig/rigor/plugin/manifest.rbs +51 -11
- data/sig/rigor/plugin/protocol_contract.rbs +68 -0
- data/sig/rigor/plugin/registry.rbs +62 -1
- data/sig/rigor/plugin.rbs +1 -1
- data/sig/rigor/rbs_extended.rbs +1 -1
- data/sig/rigor/reflection.rbs +9 -6
- data/sig/rigor/scope.rbs +148 -12
- data/sig/rigor/sig_gen/skip_reason_catalog.rbs +21 -0
- data/sig/rigor/source.rbs +4 -4
- data/sig/rigor/testing.rbs +10 -4
- data/sig/rigor/type.rbs +33 -1
- data/sig/rigor.rbs +39 -20
- data/skills/rigor-ask/SKILL.md +16 -11
- data/skills/rigor-baseline-reduce/SKILL.md +4 -6
- data/skills/rigor-ci-setup/SKILL.md +17 -21
- data/skills/rigor-doctor/SKILL.md +24 -22
- data/skills/rigor-doctor/references/01-checks.md +97 -33
- data/skills/rigor-editor-setup/SKILL.md +6 -4
- data/skills/rigor-mcp-setup/SKILL.md +5 -4
- data/skills/rigor-monkeypatch-resolve/SKILL.md +5 -3
- data/skills/rigor-next-steps/SKILL.md +4 -2
- data/skills/rigor-plugin-author/SKILL.md +19 -23
- data/skills/rigor-plugin-author/references/01-plan-and-scaffold.md +9 -8
- data/skills/rigor-plugin-author/references/02-walker-and-types.md +25 -27
- data/skills/rigor-plugin-author/references/03-test-and-ship.md +6 -8
- data/skills/rigor-plugin-review/SKILL.md +6 -4
- data/skills/rigor-plugin-review/references/01-best-practices-checklist.md +2 -1
- data/skills/rigor-plugin-tune/SKILL.md +4 -2
- data/skills/rigor-project-init/SKILL.md +15 -10
- data/skills/rigor-project-init/references/01-detect.md +13 -9
- data/skills/rigor-project-init/references/02-configure.md +43 -14
- data/skills/rigor-project-init/references/03-baseline-and-bugs.md +14 -14
- data/skills/rigor-project-init/references/04-sig-uplift.md +27 -14
- data/skills/rigor-project-init/references/06-agent-contract.md +67 -0
- data/skills/rigor-protection-uplift/SKILL.md +4 -6
- data/skills/rigor-rbs-setup/SKILL.md +4 -2
- data/skills/rigor-type-oracle/SKILL.md +226 -0
- data/skills/rigor-type-oracle/references/01-oracle-commands.md +265 -0
- data/skills/rigor-type-oracle/references/02-agents-md-fragment.md +52 -0
- data/skills/rigor-type-oracle/references/03-gap-protocol.md +125 -0
- data/skills/rigor-unused-adjudicate/SKILL.md +12 -7
- data/skills/rigor-upgrade/SKILL.md +13 -8
- metadata +133 -3
- data/lib/rigor/cli/probe_environment.rb +0 -85
- data/sig/rigor/inference/builtins/numeric_catalog.rbs +0 -3
|
@@ -22,17 +22,19 @@ module Rigor
|
|
|
22
22
|
|
|
23
23
|
module_function
|
|
24
24
|
|
|
25
|
-
# @param paths
|
|
26
|
-
# @
|
|
25
|
+
# @param paths — absolute paths to `.rb` files the project's `paths:` resolves to.
|
|
26
|
+
# @param io_boundary — the plugin's {Rigor::Plugin::IoBoundary}; every source read goes
|
|
27
|
+
# through it (#630) so each scanned file is a recorded cache dependency.
|
|
28
|
+
# @return frozen, sorted list of recognized contract class FQNs (e.g.
|
|
27
29
|
# `["App::NewUserContract", "Types::EmailContract"]`).
|
|
28
|
-
def scan(paths:)
|
|
30
|
+
def scan(paths:, io_boundary:)
|
|
29
31
|
contracts = []
|
|
30
|
-
paths.each { |path| contracts.concat(scan_file(path)) }
|
|
32
|
+
paths.each { |path| contracts.concat(scan_file(path, io_boundary)) }
|
|
31
33
|
contracts.uniq.sort.freeze
|
|
32
34
|
end
|
|
33
35
|
|
|
34
|
-
def scan_file(path)
|
|
35
|
-
source =
|
|
36
|
+
def scan_file(path, io_boundary)
|
|
37
|
+
source = io_boundary.read_file(path)
|
|
36
38
|
parse_result = Prism.parse(source, filepath: path)
|
|
37
39
|
return [] unless parse_result.errors.empty?
|
|
38
40
|
|
|
@@ -50,24 +52,24 @@ module Rigor
|
|
|
50
52
|
# not a degrade-gracefully fallback, because this plugin ships no required/optional walker of
|
|
51
53
|
# its own.
|
|
52
54
|
#
|
|
53
|
-
# @return
|
|
55
|
+
# @return contract FQN => `{params: <shape>}` and/or
|
|
54
56
|
# `{json: <shape>}` (only the recognised key(s) are present; a contract with neither present
|
|
55
57
|
# contributes nothing). Each `<shape>` is exactly {DrySchema::SchemaScanner.collect_schema_shape}'s
|
|
56
58
|
# `{required:, optional:, unmodelled:}` return.
|
|
57
|
-
def scan_schema_blocks(paths:, type_aliases: {})
|
|
59
|
+
def scan_schema_blocks(paths:, io_boundary:, type_aliases: {})
|
|
58
60
|
return {} unless Rigor::Plugin.registered_for("dry-schema")
|
|
59
61
|
|
|
60
62
|
table = {}
|
|
61
63
|
paths.each do |path|
|
|
62
|
-
scan_file_schema_blocks(path, type_aliases).each do |fqn, shapes|
|
|
64
|
+
scan_file_schema_blocks(path, io_boundary, type_aliases).each do |fqn, shapes|
|
|
63
65
|
table[fqn] ||= shapes
|
|
64
66
|
end
|
|
65
67
|
end
|
|
66
68
|
table.freeze
|
|
67
69
|
end
|
|
68
70
|
|
|
69
|
-
def scan_file_schema_blocks(path, type_aliases)
|
|
70
|
-
source =
|
|
71
|
+
def scan_file_schema_blocks(path, io_boundary, type_aliases)
|
|
72
|
+
source = io_boundary.read_file(path)
|
|
71
73
|
parse_result = Prism.parse(source, filepath: path)
|
|
72
74
|
return {} unless parse_result.errors.empty?
|
|
73
75
|
|
|
@@ -44,6 +44,7 @@ module Rigor
|
|
|
44
44
|
class DryValidation < Rigor::Plugin::Base
|
|
45
45
|
manifest(
|
|
46
46
|
id: "dry-validation",
|
|
47
|
+
target_gems: ["dry-validation"],
|
|
47
48
|
version: "0.1.0",
|
|
48
49
|
description: "Recognises `class T < Dry::Validation::Contract` subclasses, publishes the " \
|
|
49
50
|
"contract FQN set, and (with rigor-dry-schema loaded) refines each contract's " \
|
|
@@ -94,7 +95,7 @@ module Rigor
|
|
|
94
95
|
end
|
|
95
96
|
|
|
96
97
|
def prepare(services)
|
|
97
|
-
contracts = ContractScanner.scan(paths: scannable_paths(services))
|
|
98
|
+
contracts = ContractScanner.scan(paths: scannable_paths(services), io_boundary: io_boundary)
|
|
98
99
|
unless contracts.empty?
|
|
99
100
|
services.fact_store.publish(
|
|
100
101
|
plugin_id: manifest.id,
|
|
@@ -104,7 +105,9 @@ module Rigor
|
|
|
104
105
|
end
|
|
105
106
|
|
|
106
107
|
type_aliases = services.fact_store.read(plugin_id: "dry-types", name: :dry_type_aliases) || {}
|
|
107
|
-
params_table = ContractScanner.scan_schema_blocks(paths: scannable_paths(services),
|
|
108
|
+
params_table = ContractScanner.scan_schema_blocks(paths: scannable_paths(services),
|
|
109
|
+
io_boundary: io_boundary,
|
|
110
|
+
type_aliases: type_aliases)
|
|
108
111
|
return if params_table.empty?
|
|
109
112
|
|
|
110
113
|
services.fact_store.publish(
|
|
@@ -137,11 +140,13 @@ module Rigor
|
|
|
137
140
|
shapes[name] = row.nil? ? nil : ParamsShape.build(row)
|
|
138
141
|
end
|
|
139
142
|
|
|
143
|
+
# ADR-45 WD1b (#613 / #630) — the classification probes go through the boundary, so an entry that
|
|
144
|
+
# is not there yet (or stops being a directory) is a recorded dependency of the scan's input set.
|
|
140
145
|
def scannable_paths(services)
|
|
141
146
|
@scannable_paths ||= services.configuration.paths.flat_map do |entry|
|
|
142
|
-
if
|
|
147
|
+
if io_boundary.directory?(entry)
|
|
143
148
|
Dir.glob(File.join(entry, "**", "*.rb"), sort: true)
|
|
144
|
-
elsif
|
|
149
|
+
elsif io_boundary.file?(entry) && entry.end_with?(".rb")
|
|
145
150
|
[entry]
|
|
146
151
|
else
|
|
147
152
|
[]
|
|
@@ -8,6 +8,7 @@ module Rigor
|
|
|
8
8
|
class Ethon < Base
|
|
9
9
|
manifest(
|
|
10
10
|
id: "ethon",
|
|
11
|
+
target_gems: ["ethon"],
|
|
11
12
|
version: "0.1.0",
|
|
12
13
|
description: "Models Ethon / Libcurl options, dynamic return types, and multi-loop operations.",
|
|
13
14
|
signature_paths: ["sig"]
|
|
@@ -22,6 +23,7 @@ module Rigor
|
|
|
22
23
|
response_body: -> { Rigor::Type::Combinator.nominal_of("String") },
|
|
23
24
|
response_headers: -> { Rigor::Type::Combinator.nominal_of("String") }
|
|
24
25
|
}.freeze
|
|
26
|
+
Ractor.make_shareable(EASY_RETURN_TYPES)
|
|
25
27
|
|
|
26
28
|
dynamic_return receivers: ["Ethon::Easy"], methods: EASY_RETURN_TYPES.keys do |call_node, _scope|
|
|
27
29
|
builder = EASY_RETURN_TYPES[call_node.name]
|
|
@@ -28,11 +28,6 @@ module Rigor
|
|
|
28
28
|
# The violations for a single entry call (`FactoryBot.create(...)` etc.), or `[]` when the node
|
|
29
29
|
# is not an entry call or its first argument is not a literal factory name. ADR-37: the engine
|
|
30
30
|
# owns the walk.
|
|
31
|
-
#
|
|
32
|
-
# @param call_node [Prism::Node]
|
|
33
|
-
# @param factory_index [FactoryIndex]
|
|
34
|
-
# @param model_index [Hash, nil]
|
|
35
|
-
# @return [Array<Violation>]
|
|
36
31
|
def violations_for(call_node:, factory_index:, model_index: nil)
|
|
37
32
|
return [] unless entry_call?(call_node)
|
|
38
33
|
|
|
@@ -58,6 +58,7 @@ module Rigor
|
|
|
58
58
|
class Factorybot < Rigor::Plugin::Base
|
|
59
59
|
manifest(
|
|
60
60
|
id: "factorybot",
|
|
61
|
+
target_gems: ["factory_bot"],
|
|
61
62
|
# Bumped 2026-08-16 — publishes `:reachability_references` for `rigor unused` (ADR-102 WD3 / #350).
|
|
62
63
|
version: "0.3.0",
|
|
63
64
|
description: "Validates FactoryBot.create / build / attributes_for call shapes; " \
|
|
@@ -69,7 +70,7 @@ module Rigor
|
|
|
69
70
|
consumes: [
|
|
70
71
|
{ plugin_id: "activerecord", name: :model_index, optional: true }
|
|
71
72
|
],
|
|
72
|
-
produces: [
|
|
73
|
+
produces: %i[reachability_references factory_index]
|
|
73
74
|
)
|
|
74
75
|
|
|
75
76
|
producer :factory_index, watch: -> { [[@factory_search_paths, "**/*.rb"]] } do |_params|
|
|
@@ -101,6 +102,12 @@ module Rigor
|
|
|
101
102
|
index = producer_value(:factory_index)
|
|
102
103
|
return if index.nil? || index.empty?
|
|
103
104
|
|
|
105
|
+
# The producer value and the ADR-9 fact are different channels (#921) — `producer_value` is this
|
|
106
|
+
# plugin's own cached computation, read back via `producer_value` above; `fact_store.publish` is
|
|
107
|
+
# what makes it visible to another plugin's `read_fact`, which is how rigor-rspec binds
|
|
108
|
+
# `create(:name)` to the factory's model class.
|
|
109
|
+
services.fact_store.publish(plugin_id: manifest.id, name: :factory_index, value: index)
|
|
110
|
+
|
|
104
111
|
references = index.entries.values.filter_map do |entry|
|
|
105
112
|
{ name: entry.model_class, role: :test } if entry.model_class
|
|
106
113
|
end.uniq
|
|
@@ -20,7 +20,7 @@ module Rigor
|
|
|
20
20
|
].to_set.freeze
|
|
21
21
|
|
|
22
22
|
# Regex anchor must match end of string \z
|
|
23
|
-
NOMINAL_OPAQUE_REGEX = Regexp.new("(_ptr|_handle|Ptr|Handle)\\z")
|
|
23
|
+
NOMINAL_OPAQUE_REGEX = Regexp.new("(_ptr|_handle|Ptr|Handle)\\z").freeze
|
|
24
24
|
|
|
25
25
|
BOOL_TYPE = Rigor::Type::Combinator.union(
|
|
26
26
|
Rigor::Type::Combinator.constant_of(true),
|
|
@@ -13,9 +13,21 @@ module Rigor
|
|
|
13
13
|
class FFI < Base
|
|
14
14
|
manifest(
|
|
15
15
|
id: "ffi",
|
|
16
|
-
|
|
16
|
+
target_gems: ["ffi"],
|
|
17
|
+
# Bumped 2026-09-10 (#918) — declares `config_schema` for the two `.rigor.yml` surfaces ADR-30
|
|
18
|
+
# WD4 (`exceptions`) and WD6 (`target`) already read off `config` but the manifest never
|
|
19
|
+
# published, so both keys were rejected by `Manifest#validate_config` as unknown.
|
|
20
|
+
version: "0.2.0",
|
|
17
21
|
description: "Models FFI library bindings, struct layouts, callbacks, carrier types, and ffx target compatibility.",
|
|
18
|
-
signature_paths: ["sig"]
|
|
22
|
+
signature_paths: ["sig"],
|
|
23
|
+
config_schema: {
|
|
24
|
+
# WD4 — typedef alias names the nominal-opaque-pointer heuristic should treat as a transparent
|
|
25
|
+
# `:pointer` alias even though they match the `_ptr$` / `_handle$` naming pattern.
|
|
26
|
+
"exceptions" => { kind: :array, default: [] },
|
|
27
|
+
# WD6 — forces ffx-target detection instead of the `extconf.rb` / `Gemfile.lock` cascade.
|
|
28
|
+
# `"auto"` (the default) keeps the cascade; `"ffi"` / `"ffx"` pin the target outright.
|
|
29
|
+
"target" => { kind: :string, default: "auto" }
|
|
30
|
+
}
|
|
19
31
|
)
|
|
20
32
|
|
|
21
33
|
producer :ffi_catalog do
|
|
@@ -25,7 +37,13 @@ module Rigor
|
|
|
25
37
|
|
|
26
38
|
# Dynamic return rule for attached FFI functions
|
|
27
39
|
# Gated on known FFI library receivers and attached function names
|
|
28
|
-
|
|
40
|
+
#
|
|
41
|
+
# Issue #701 — both receiver kinds are declared because the block below already resolved
|
|
42
|
+
# `Nominal` and `Singleton` alike: `attach_function` installs the binding on the library module
|
|
43
|
+
# itself (`MyLib.strlen`) and `include`ing that module makes the same name an instance call, so
|
|
44
|
+
# neither kind is an accident. The kind-aware gate makes that intent explicit rather than relying
|
|
45
|
+
# on a `receivers:` entry answering for both.
|
|
46
|
+
dynamic_return receivers: -> { both_receiver_kinds(producer_value(:ffi_catalog)&.libraries) },
|
|
29
47
|
methods: -> { producer_value(:ffi_catalog)&.function_method_names || [] } do |call_node, scope|
|
|
30
48
|
catalog = producer_value(:ffi_catalog)
|
|
31
49
|
next nil if catalog.nil?
|
|
@@ -51,7 +69,11 @@ module Rigor
|
|
|
51
69
|
|
|
52
70
|
# Dynamic return rule for FFI struct field accessors
|
|
53
71
|
# Gated on known FFI struct class names and field names
|
|
54
|
-
|
|
72
|
+
#
|
|
73
|
+
# Issue #701 — both kinds again, for the same reason: the block resolves the receiver itself and
|
|
74
|
+
# answers only for a name the discovered layout carries, so restricting the gate to instances
|
|
75
|
+
# would narrow a shipped rule on a shape nothing in the corpus has adjudicated.
|
|
76
|
+
dynamic_return receivers: -> { both_receiver_kinds(producer_value(:ffi_catalog)&.struct_names) },
|
|
55
77
|
methods: -> { producer_value(:ffi_catalog)&.struct_field_names || [] } do |call_node, scope|
|
|
56
78
|
catalog = producer_value(:ffi_catalog)
|
|
57
79
|
next nil if catalog.nil?
|
|
@@ -114,6 +136,16 @@ module Rigor
|
|
|
114
136
|
@target = TargetDetector.detect(root: root, config: config)
|
|
115
137
|
@exceptions = config["exceptions"] || []
|
|
116
138
|
end
|
|
139
|
+
|
|
140
|
+
private
|
|
141
|
+
|
|
142
|
+
# Every discovered name in both `dynamic_return receivers:` kinds (#701), for the two rules whose
|
|
143
|
+
# blocks accept an instance and a class receiver alike.
|
|
144
|
+
#
|
|
145
|
+
# @param names — discovered class / module names, or nil when the catalog producer did not run
|
|
146
|
+
def both_receiver_kinds(names)
|
|
147
|
+
Array(names).flat_map { |name| [name, "singleton(#{name})"] }
|
|
148
|
+
end
|
|
117
149
|
end
|
|
118
150
|
end
|
|
119
151
|
end
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rigor/plugin"
|
|
4
|
+
|
|
5
|
+
module Rigor
|
|
6
|
+
module Plugin
|
|
7
|
+
# rigor-grape — recognises the Grape endpoint-declaration DSL (`class API < Grape::API`) and the
|
|
8
|
+
# grape-entity exposure DSL (`class E < Grape::Entity`) so the calls stop reading `Dynamic[top]`
|
|
9
|
+
# (issue #1099; gitlab's `lib/api` accounted for ~10k opaque implicit-self sends in the
|
|
10
|
+
# 2026-09-19 survey — `expose` ~3.9k, `optional` ~2.2k, `route_setting` ~1.5k, `desc` ~1.4k,
|
|
11
|
+
# `requires` ~1.4k).
|
|
12
|
+
#
|
|
13
|
+
# Grape is more dynamic than the frameworks the ADR-16 substrate was built for:
|
|
14
|
+
#
|
|
15
|
+
# - `Grape::API` subclasses have NO static class methods — every declaration call is forwarded
|
|
16
|
+
# to the base `Grape::API::Instance` class object at runtime (`delegate_missing_to` +
|
|
17
|
+
# `override_all_methods!`, `lib/grape/api.rb`). The bundled sig declares the shared surface
|
|
18
|
+
# once in `Grape::DSL::ClassMethods` and `extend`s it onto both `Grape::API` (reached from
|
|
19
|
+
# source subclasses via `rbs_complete_ancestors`, ADR-43 WD4) and `Grape::API::Instance`
|
|
20
|
+
# (reached inside `namespace` bodies, whose `self` is the Instance class object).
|
|
21
|
+
# - Block `self` bindings differ per macro family — `params` bodies `instance_eval` on a
|
|
22
|
+
# `Grape::Validations::ParamsScope` instance, `namespace`/`route_param`/`version`/`given`/
|
|
23
|
+
# `mounted` bodies on the Instance class object, and verb bodies run as `Grape::Endpoint`
|
|
24
|
+
# instance methods. `block_as_methods` entries carry a named `self_type` ("Foo" /
|
|
25
|
+
# "singleton(Foo)") so each body binds the object Grape actually evaluates it on.
|
|
26
|
+
# - `Grape::Entity`'s `expose` bodies run via `block.call` — `self` stays the Entity class
|
|
27
|
+
# object — so nested `expose` calls need no entry; the `def self.` declarations cover them.
|
|
28
|
+
#
|
|
29
|
+
# ## Deferred (documented in README)
|
|
30
|
+
#
|
|
31
|
+
# - `helpers do ... end` bodies (`class_eval` on an anonymous Module — unnamed self).
|
|
32
|
+
# - Typing `present`/`declared` results against the declared entity/params (runtime shape).
|
|
33
|
+
class Grape < Rigor::Plugin::Base
|
|
34
|
+
# `namespace`-family bodies evaluate as instance methods of the Instance *class object*
|
|
35
|
+
# (`Instance.nest` / `evaluate_as_instance_with_configuration` do `instance_eval(&block)`).
|
|
36
|
+
# `scope` belongs here too: `Grape::DSL::Routing#scope` is `within_namespace { nest(block) }`,
|
|
37
|
+
# so its body `instance_eval`s on the same Instance class object as `namespace`.
|
|
38
|
+
NAMESPACE_METHODS = %i[
|
|
39
|
+
namespace group resource resources segment scope route_param version given mounted
|
|
40
|
+
].freeze
|
|
41
|
+
# HTTP verb macros are generated over `Grape::HTTP_SUPPORTED_METHODS` and delegate to `route`;
|
|
42
|
+
# their bodies run inside `Grape::Endpoint` instances.
|
|
43
|
+
VERB_METHODS = %i[get put post delete head patch options route].freeze
|
|
44
|
+
# `params` bodies evaluate on a `ParamsScope` instance; the block-carrying scope macros re-enter
|
|
45
|
+
# a child scope the same way.
|
|
46
|
+
PARAMS_SCOPE_METHODS = %i[requires optional given with].freeze
|
|
47
|
+
|
|
48
|
+
manifest(
|
|
49
|
+
id: "grape",
|
|
50
|
+
target_gems: %w[grape grape-entity],
|
|
51
|
+
version: "0.1.0",
|
|
52
|
+
description: "Types the Grape endpoint-declaration DSL (`Grape::API` subclasses: `params`, " \
|
|
53
|
+
"`namespace`, HTTP verb macros, `desc`, `route_setting`, `helpers`) and the " \
|
|
54
|
+
"grape-entity exposure DSL (`Grape::Entity` subclasses: `expose`), including " \
|
|
55
|
+
"the `instance_eval`'d block `self` bindings.",
|
|
56
|
+
signature_paths: ["sig"],
|
|
57
|
+
# ADR-43 WD4 — `Grape::API`/`Grape::Entity` subclasses bridge their class-level DSL calls to
|
|
58
|
+
# the bundled sig's `def self.` declarations. Justified because the bundled sig IS the
|
|
59
|
+
# authority (neither gem ships RBS) and the declared surface is what the DSL exposes.
|
|
60
|
+
rbs_complete_ancestors: %w[
|
|
61
|
+
Grape::API
|
|
62
|
+
Grape::Entity
|
|
63
|
+
],
|
|
64
|
+
# All five classes have genuinely open runtime surfaces (`override_all_methods!` generates
|
|
65
|
+
# and forwards methods on API subclasses; ParamsScope/Endpoint pick up DSL modules) — calls
|
|
66
|
+
# we don't declare must stay opaque, not diagnosed.
|
|
67
|
+
open_receivers: %w[
|
|
68
|
+
Grape::API
|
|
69
|
+
Grape::API::Instance
|
|
70
|
+
Grape::Entity
|
|
71
|
+
Grape::Validations::ParamsScope
|
|
72
|
+
Grape::Endpoint
|
|
73
|
+
],
|
|
74
|
+
block_as_methods: [
|
|
75
|
+
# Class-body context: `class API < Grape::API; namespace :x do ... end`.
|
|
76
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
77
|
+
receiver_constraint: "Grape::API",
|
|
78
|
+
method_names: NAMESPACE_METHODS,
|
|
79
|
+
self_type: "singleton(Grape::API::Instance)"
|
|
80
|
+
),
|
|
81
|
+
# Inside an already-narrowed namespace body (self is the Instance class object), nested
|
|
82
|
+
# `namespace`/`version`/`given` calls re-enter the same context.
|
|
83
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
84
|
+
receiver_constraint: "Grape::API::Instance",
|
|
85
|
+
method_names: NAMESPACE_METHODS,
|
|
86
|
+
self_type: "singleton(Grape::API::Instance)"
|
|
87
|
+
),
|
|
88
|
+
# `params do ... end` — body `instance_eval`s on a `ParamsScope` instance.
|
|
89
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
90
|
+
receiver_constraint: "Grape::API",
|
|
91
|
+
method_names: %i[params],
|
|
92
|
+
self_type: "Grape::Validations::ParamsScope"
|
|
93
|
+
),
|
|
94
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
95
|
+
receiver_constraint: "Grape::API::Instance",
|
|
96
|
+
method_names: %i[params],
|
|
97
|
+
self_type: "Grape::Validations::ParamsScope"
|
|
98
|
+
),
|
|
99
|
+
# `requires :x, type: Hash do ... end` inside a params body re-enters a child ParamsScope —
|
|
100
|
+
# the receiver is already the `Nominal[ParamsScope]` `self` of the enclosing body, which is
|
|
101
|
+
# what named-instance `self_type` entries additionally match.
|
|
102
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
103
|
+
receiver_constraint: "Grape::Validations::ParamsScope",
|
|
104
|
+
method_names: PARAMS_SCOPE_METHODS,
|
|
105
|
+
self_type: "Grape::Validations::ParamsScope"
|
|
106
|
+
),
|
|
107
|
+
# `desc 'x' do ... end` — the config block `instance_exec`s on a generated
|
|
108
|
+
# `SettingsContainer` subclass (`StrictHashConfiguration.config_class(*Desc::
|
|
109
|
+
# ROUTE_ATTRIBUTES)` in dsl/desc.rb): `detail`, `success`, `failure`, `tags`, `entity`,
|
|
110
|
+
# `hidden`, `is_array`, `consumes`, `headers`, … each take one value and return it.
|
|
111
|
+
# Modelled as the `Grape::DSL::Desc::ConfigContext` sig carrier — a closed surface, so a
|
|
112
|
+
# misspelt or invented setter still reads `call.undefined-method`, matching the runtime
|
|
113
|
+
# NoMethodError.
|
|
114
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
115
|
+
receiver_constraint: "Grape::API",
|
|
116
|
+
method_names: %i[desc],
|
|
117
|
+
self_type: "Grape::DSL::Desc::ConfigContext"
|
|
118
|
+
),
|
|
119
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
120
|
+
receiver_constraint: "Grape::API::Instance",
|
|
121
|
+
method_names: %i[desc],
|
|
122
|
+
self_type: "Grape::DSL::Desc::ConfigContext"
|
|
123
|
+
),
|
|
124
|
+
# Verb bodies run inside `Grape::Endpoint` instances.
|
|
125
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
126
|
+
receiver_constraint: "Grape::API",
|
|
127
|
+
method_names: VERB_METHODS,
|
|
128
|
+
self_type: "Grape::Endpoint"
|
|
129
|
+
),
|
|
130
|
+
Rigor::Plugin::Macro::BlockAsMethod.new(
|
|
131
|
+
receiver_constraint: "Grape::API::Instance",
|
|
132
|
+
method_names: VERB_METHODS,
|
|
133
|
+
self_type: "Grape::Endpoint"
|
|
134
|
+
)
|
|
135
|
+
]
|
|
136
|
+
)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
Rigor::Plugin.register(Grape)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Gem entry point. Required by Rigor's plugin loader when `.rigor.yml` lists `rigor-grape` under
|
|
4
|
+
# `plugins:`. The loader expects this `require` to side-effect a call to `Rigor::Plugin.register`,
|
|
5
|
+
# which the body of `lib/rigor/plugin/grape.rb` performs at load time.
|
|
6
|
+
require_relative "rigor/plugin/grape"
|