Module: LcpRuby

Defined in:
lib/lcp_ruby.rb,
lib/lcp_ruby/cli.rb,
lib/lcp_ruby/menu.rb,
lib/lcp_ruby/engine.rb,
lib/lcp_ruby/export.rb,
lib/lcp_ruby/import.rb,
lib/lcp_ruby/current.rb,
lib/lcp_ruby/dynamic.rb,
lib/lcp_ruby/version.rb,
lib/lcp_ruby/gem_paths.rb,
lib/lcp_ruby/i18n_lint.rb,
lib/lcp_ruby/hash_utils.rb,
lib/lcp_ruby/i18n_check.rb,
lib/lcp_ruby/path_utils.rb,
lib/lcp_ruby/url_safety.rb,
app/models/lcp_ruby/user.rb,
lib/lcp_ruby/array_query.rb,
lib/lcp_ruby/dev_toolbar.rb,
lib/lcp_ruby/pages/setup.rb,
lib/lcp_ruby/roles/setup.rb,
lib/lcp_ruby/asset_copier.rb,
lib/lcp_ruby/bulk_updater.rb,
lib/lcp_ruby/export/setup.rb,
lib/lcp_ruby/groups/setup.rb,
lib/lcp_ruby/import/setup.rb,
lib/lcp_ruby/kanban/board.rb,
lib/lcp_ruby/tasks/doctor.rb,
lib/lcp_ruby/batch_actions.rb,
lib/lcp_ruby/configuration.rb,
lib/lcp_ruby/custom_fields.rb,
lib/lcp_ruby/kanban/column.rb,
lib/lcp_ruby/metrics/setup.rb,
lib/lcp_ruby/search_result.rb,
lib/lcp_ruby/user_snapshot.rb,
lib/lcp_ruby/auditing/setup.rb,
lib/lcp_ruby/authentication.rb,
lib/lcp_ruby/dsl/dsl_loader.rb,
lib/lcp_ruby/pages/registry.rb,
lib/lcp_ruby/pages/resolver.rb,
lib/lcp_ruby/roles/registry.rb,
lib/lcp_ruby/workflow/setup.rb,
lib/lcp_ruby/cli/new_command.rb,
lib/lcp_ruby/cli/run_command.rb,
lib/lcp_ruby/dsl/job_builder.rb,
lib/lcp_ruby/groups/contract.rb,
lib/lcp_ruby/groups/registry.rb,
lib/lcp_ruby/kanban/swimlane.rb,
lib/lcp_ruby/metadata/loader.rb,
lib/lcp_ruby/virtual_columns.rb,
lib/lcp_ruby/workflow/errors.rb,
lib/lcp_ruby/cli/docs_command.rb,
lib/lcp_ruby/data_source/base.rb,
lib/lcp_ruby/data_source/host.rb,
lib/lcp_ruby/dsl/type_builder.rb,
lib/lcp_ruby/services/checker.rb,
lib/lcp_ruby/skills_installer.rb,
lib/lcp_ruby/auditing/registry.rb,
lib/lcp_ruby/controller/search.rb,
lib/lcp_ruby/data_source/setup.rb,
lib/lcp_ruby/dsl/field_builder.rb,
lib/lcp_ruby/dsl/model_builder.rb,
lib/lcp_ruby/events/dispatcher.rb,
lib/lcp_ruby/grouped_query/row.rb,
lib/lcp_ruby/i18n_check/runner.rb,
lib/lcp_ruby/json_item_wrapper.rb,
lib/lcp_ruby/metrics/collector.rb,
lib/lcp_ruby/pages/filter_form.rb,
lib/lcp_ruby/permissions/setup.rb,
lib/lcp_ruby/services/registry.rb,
lib/lcp_ruby/workflow/contract.rb,
lib/lcp_ruby/workflow/registry.rb,
lib/lcp_ruby/workflow/resolver.rb,
lib/lcp_ruby/cli/skills_command.rb,
lib/lcp_ruby/display/icon_badge.rb,
lib/lcp_ruby/display/text_badge.rb,
lib/lcp_ruby/groups/host_loader.rb,
lib/lcp_ruby/groups/yaml_loader.rb,
lib/lcp_ruby/i18n_check/offense.rb,
lib/lcp_ruby/import/auto_mapper.rb,
lib/lcp_ruby/import/file_parser.rb,
lib/lcp_ruby/kanban/move_result.rb,
lib/lcp_ruby/metadata/menu_item.rb,
lib/lcp_ruby/metrics/json_query.rb,
lib/lcp_ruby/metrics/subscriber.rb,
lib/lcp_ruby/presenter/resolver.rb,
app/helpers/lcp_ruby/form_helper.rb,
app/helpers/lcp_ruby/tree_helper.rb,
lib/lcp_ruby/actions/base_action.rb,
lib/lcp_ruby/api_tokens/verifier.rb,
lib/lcp_ruby/association_fk_type.rb,
lib/lcp_ruby/authorization/cache.rb,
lib/lcp_ruby/authorization/codes.rb,
lib/lcp_ruby/condition_evaluator.rb,
lib/lcp_ruby/custom_fields/query.rb,
lib/lcp_ruby/custom_fields/setup.rb,
lib/lcp_ruby/custom_fields/utils.rb,
lib/lcp_ruby/display/count_badge.rb,
lib/lcp_ruby/events/handler_base.rb,
lib/lcp_ruby/groups/model_loader.rb,
lib/lcp_ruby/i18n_check/reporter.rb,
lib/lcp_ruby/metadata/i18n_label.rb,
lib/lcp_ruby/metrics/fingerprint.rb,
lib/lcp_ruby/saved_filters/setup.rb,
lib/lcp_ruby/search/quick_search.rb,
lib/lcp_ruby/types/type_registry.rb,
lib/lcp_ruby/view_slots/registry.rb,
lib/lcp_ruby/cli/examples_command.rb,
lib/lcp_ruby/conditions/validator.rb,
lib/lcp_ruby/data_source/registry.rb,
lib/lcp_ruby/dsl/workflow_builder.rb,
lib/lcp_ruby/embed_providers/base.rb,
lib/lcp_ruby/import/row_processor.rb,
lib/lcp_ruby/import/value_coercer.rb,
lib/lcp_ruby/kanban/host_provider.rb,
lib/lcp_ruby/metrics/rate_limiter.rb,
lib/lcp_ruby/pages/change_handler.rb,
lib/lcp_ruby/permissions/registry.rb,
lib/lcp_ruby/presenter/action_set.rb,
lib/lcp_ruby/presenter/column_set.rb,
lib/lcp_ruby/presenter/enrichment.rb,
lib/lcp_ruby/record_aliases/setup.rb,
lib/lcp_ruby/roles/change_handler.rb,
lib/lcp_ruby/search/query_builder.rb,
lib/lcp_ruby/sort/enum_sort_order.rb,
lib/lcp_ruby/types/built_in_types.rb,
lib/lcp_ruby/widgets/date_grouper.rb,
lib/lcp_ruby/workflow/host_source.rb,
app/helpers/lcp_ruby/dialog_helper.rb,
app/helpers/lcp_ruby/layout_helper.rb,
app/helpers/lcp_ruby/search_helper.rb,
lib/lcp_ruby/auditing/audit_writer.rb,
lib/lcp_ruby/authentication/errors.rb,
lib/lcp_ruby/authorized_controller.rb,
lib/lcp_ruby/background_jobs/setup.rb,
lib/lcp_ruby/data_source/rest_json.rb,
lib/lcp_ruby/display/base_renderer.rb,
lib/lcp_ruby/dsl/condition_builder.rb,
lib/lcp_ruby/dsl/presenter_builder.rb,
lib/lcp_ruby/export/data_generator.rb,
lib/lcp_ruby/export/export_handler.rb,
lib/lcp_ruby/grouped_query/builder.rb,
lib/lcp_ruby/groups/change_handler.rb,
lib/lcp_ruby/i18n_check/heuristics.rb,
lib/lcp_ruby/model_factory/builder.rb,
lib/lcp_ruby/types/type_definition.rb,
lib/lcp_ruby/widgets/chart_palette.rb,
lib/lcp_ruby/widgets/data_resolver.rb,
lib/lcp_ruby/workflow/audit_writer.rb,
lib/lcp_ruby/workflow/model_source.rb,
app/helpers/lcp_ruby/display_helper.rb,
lib/generators/lcp_ruby/dsl_to_yaml.rb,
lib/lcp_ruby/background_jobs/errors.rb,
lib/lcp_ruby/custom_fields/registry.rb,
lib/lcp_ruby/display/renderers/code.rb,
lib/lcp_ruby/display/renderers/date.rb,
lib/lcp_ruby/display/renderers/link.rb,
lib/lcp_ruby/display/renderers/text.rb,
lib/lcp_ruby/dsl/view_group_builder.rb,
lib/lcp_ruby/export/value_formatter.rb,
lib/lcp_ruby/i18n_check/key_deriver.rb,
lib/lcp_ruby/metadata/erd_generator.rb,
lib/lcp_ruby/metadata/path_template.rb,
lib/lcp_ruby/metrics/error_recorder.rb,
lib/lcp_ruby/model_factory/registry.rb,
lib/lcp_ruby/pages/scope_filter_set.rb,
lib/lcp_ruby/saved_filters/registry.rb,
lib/lcp_ruby/saved_filters/resolver.rb,
lib/lcp_ruby/search/param_sanitizer.rb,
lib/lcp_ruby/types/transforms/strip.rb,
lib/lcp_ruby/workflow/state_machine.rb,
lib/lcp_ruby/workflow/static_source.rb,
lib/lcp_ruby/actions/action_executor.rb,
lib/lcp_ruby/actions/action_registry.rb,
lib/lcp_ruby/association_join_column.rb,
lib/lcp_ruby/authentication/provider.rb,
lib/lcp_ruby/authorization/page_gate.rb,
lib/lcp_ruby/background_jobs/enqueue.rb,
lib/lcp_ruby/controller/crud_helpers.rb,
lib/lcp_ruby/controller/path_helpers.rb,
lib/lcp_ruby/controller/view_helpers.rb,
lib/lcp_ruby/display/renderers/badge.rb,
lib/lcp_ruby/display/renderers/image.rb,
lib/lcp_ruby/embed_providers/grafana.rb,
lib/lcp_ruby/events/handler_registry.rb,
lib/lcp_ruby/kanban/default_provider.rb,
lib/lcp_ruby/metadata/auth_validator.rb,
lib/lcp_ruby/metadata/reserved_names.rb,
lib/lcp_ruby/presenter/link_resolver.rb,
lib/lcp_ruby/reserved_route_segments.rb,
lib/lcp_ruby/view_slots/slot_context.rb,
lib/lcp_ruby/virtual_columns/builder.rb,
lib/lcp_ruby/widgets/chartkick_check.rb,
lib/lcp_ruby/workflow/approval/setup.rb,
lib/lcp_ruby/workflow/audit_registry.rb,
lib/lcp_ruby/workflow/change_handler.rb,
lib/lcp_ruby/workflow/value_resolver.rb,
app/helpers/lcp_ruby/condition_helper.rb,
app/helpers/lcp_ruby/dashboard_helper.rb,
app/helpers/lcp_ruby/view_slot_helper.rb,
lib/lcp_ruby/aggregates/query_builder.rb,
lib/lcp_ruby/background_jobs/contract.rb,
lib/lcp_ruby/background_jobs/registry.rb,
lib/lcp_ruby/background_jobs/resolver.rb,
lib/lcp_ruby/controller/authorization.rb,
lib/lcp_ruby/controller/impersonation.rb,
lib/lcp_ruby/custom_fields/applicator.rb,
lib/lcp_ruby/display/renderers/avatar.rb,
lib/lcp_ruby/display/renderers/number.rb,
lib/lcp_ruby/display/renderers/rating.rb,
lib/lcp_ruby/embed_providers/metabase.rb,
lib/lcp_ruby/events/async_handler_job.rb,
lib/lcp_ruby/generators/prerequisites.rb,
lib/lcp_ruby/i18n_check/configuration.rb,
lib/lcp_ruby/metadata/contract_result.rb,
lib/lcp_ruby/metadata/menu_definition.rb,
lib/lcp_ruby/metadata/page_definition.rb,
lib/lcp_ruby/metadata/zone_definition.rb,
lib/lcp_ruby/metrics/prometheus_check.rb,
lib/lcp_ruby/model_factory/array_type.rb,
lib/lcp_ruby/pages/contract_validator.rb,
lib/lcp_ruby/presenter/layout_builder.rb,
lib/lcp_ruby/roles/contract_validator.rb,
lib/lcp_ruby/routing/presenter_routes.rb,
lib/lcp_ruby/search/operator_registry.rb,
lib/lcp_ruby/widgets/scope_applicator.rb,
lib/lcp_ruby/workflow/approval/engine.rb,
lib/lcp_ruby/workflow/mermaid_builder.rb,
lib/generators/lcp_ruby/format_support.rb,
lib/lcp_ruby/actions/api_tokens/revoke.rb,
lib/lcp_ruby/authentication/jwks_cache.rb,
lib/lcp_ruby/controller/authentication.rb,
lib/lcp_ruby/controller/error_handling.rb,
lib/lcp_ruby/controller/locale_binding.rb,
lib/lcp_ruby/data_source/api_preloader.rb,
lib/lcp_ruby/display/renderer_registry.rb,
lib/lcp_ruby/display/renderers/heading.rb,
lib/lcp_ruby/export/field_tree_builder.rb,
lib/lcp_ruby/groups/contract_validator.rb,
lib/lcp_ruby/import/field_tree_builder.rb,
lib/lcp_ruby/import/import_job_handler.rb,
lib/lcp_ruby/metadata/event_definition.rb,
lib/lcp_ruby/metadata/field_definition.rb,
lib/lcp_ruby/metadata/group_definition.rb,
lib/lcp_ruby/metadata/model_definition.rb,
lib/lcp_ruby/metadata/schema_validator.rb,
lib/lcp_ruby/model_factory/api_builder.rb,
lib/lcp_ruby/presenter/metadata_lookup.rb,
lib/lcp_ruby/types/transforms/downcase.rb,
lib/lcp_ruby/view_slots/slot_component.rb,
lib/lcp_ruby/virtual_columns/collector.rb,
lib/lcp_ruby/workflow/state_definition.rb,
app/helpers/lcp_ruby/dev_toolbar_helper.rb,
app/helpers/lcp_ruby/oidc_button_helper.rb,
lib/generators/lcp_ruby/pages_generator.rb,
lib/lcp_ruby/api_tokens/model_extension.rb,
lib/lcp_ruby/api_tokens/token_generator.rb,
lib/lcp_ruby/authentication/role_mapper.rb,
lib/lcp_ruby/background_jobs/definition.rb,
lib/lcp_ruby/batch_actions/base_service.rb,
lib/lcp_ruby/condition_service_registry.rb,
lib/lcp_ruby/controller/presenter_setup.rb,
lib/lcp_ruby/data_source/cached_wrapper.rb,
lib/lcp_ruby/display/renderers/currency.rb,
lib/lcp_ruby/display/renderers/datetime.rb,
lib/lcp_ruby/display/renderers/markdown.rb,
lib/lcp_ruby/display/renderers/truncate.rb,
lib/lcp_ruby/display/renderers/url_link.rb,
lib/lcp_ruby/i18n_check/registry_walker.rb,
lib/lcp_ruby/metadata/model_hash_merger.rb,
lib/lcp_ruby/metadata/permission_merger.rb,
lib/lcp_ruby/metadata/responsive_policy.rb,
lib/lcp_ruby/metrics/collector_registry.rb,
lib/lcp_ruby/metrics/metric_definitions.rb,
lib/lcp_ruby/pages/definition_validator.rb,
lib/lcp_ruby/permissions/change_handler.rb,
lib/lcp_ruby/search/custom_field_filter.rb,
lib/lcp_ruby/sequences/sequence_manager.rb,
lib/lcp_ruby/services/built_in_defaults.rb,
lib/lcp_ruby/workflow/approval/registry.rb,
lib/lcp_ruby/workflow/transition_result.rb,
app/helpers/lcp_ruby/display/card_helper.rb,
app/helpers/lcp_ruby/i18n_payload_helper.rb,
app/helpers/lcp_ruby/link_through_helper.rb,
lib/generators/lcp_ruby/entity_generator.rb,
lib/generators/lcp_ruby/export_generator.rb,
lib/generators/lcp_ruby/groups_generator.rb,
lib/generators/lcp_ruby/import_generator.rb,
lib/lcp_ruby/association_options_builder.rb,
lib/lcp_ruby/auditing/contract_validator.rb,
lib/lcp_ruby/authentication/devise_setup.rb,
lib/lcp_ruby/authentication/http_fetcher.rb,
lib/lcp_ruby/authentication/test_support.rb,
lib/lcp_ruby/authorization/includes_hint.rb,
lib/lcp_ruby/authorization/scope_builder.rb,
lib/lcp_ruby/background_jobs/host_source.rb,
lib/lcp_ruby/display/renderers/copy_code.rb,
lib/lcp_ruby/display/renderers/file_size.rb,
lib/lcp_ruby/display/renderers/link_list.rb,
lib/lcp_ruby/display/renderers/rich_text.rb,
lib/lcp_ruby/dsl/source_location_capture.rb,
lib/lcp_ruby/dynamic_references/resolver.rb,
lib/lcp_ruby/generators/feature_registry.rb,
lib/lcp_ruby/metadata/menu_item_resolver.rb,
lib/lcp_ruby/pages/filter_form_validator.rb,
lib/lcp_ruby/permissions/source_resolver.rb,
lib/lcp_ruby/presenter/includes_resolver.rb,
lib/lcp_ruby/search/filter_param_builder.rb,
lib/lcp_ruby/search/parameter_definition.rb,
lib/lcp_ruby/services/built_in_accessors.rb,
lib/lcp_ruby/virtual_fields/virtual_form.rb,
lib/lcp_ruby/workflow/contract_validator.rb,
app/helpers/lcp_ruby/grouped_query_helper.rb,
lib/generators/lcp_ruby/install_generator.rb,
lib/lcp_ruby/actions/form_action_pipeline.rb,
lib/lcp_ruby/api_tokens/resolver_registry.rb,
lib/lcp_ruby/authentication/user_resolver.rb,
lib/lcp_ruby/authorization/policy_factory.rb,
lib/lcp_ruby/authorization/scope_resolver.rb,
lib/lcp_ruby/background_jobs/base_handler.rb,
lib/lcp_ruby/background_jobs/executor_job.rb,
lib/lcp_ruby/background_jobs/model_source.rb,
lib/lcp_ruby/display/renderers/collection.rb,
lib/lcp_ruby/display/renderers/email_link.rb,
lib/lcp_ruby/display/renderers/percentage.rb,
lib/lcp_ruby/display/renderers/phone_link.rb,
lib/lcp_ruby/dynamic_references/validator.rb,
lib/lcp_ruby/grouped_query/result_wrapper.rb,
lib/lcp_ruby/import/import_dialog_handler.rb,
lib/lcp_ruby/kanban/provider_test_harness.rb,
lib/lcp_ruby/metadata/enum_label_resolver.rb,
lib/lcp_ruby/model_factory/schema_manager.rb,
lib/lcp_ruby/pages/scope_context_resolver.rb,
lib/lcp_ruby/presenter/breadcrumb_builder.rb,
lib/lcp_ruby/saved_filters/change_handler.rb,
lib/lcp_ruby/search/query_language_parser.rb,
lib/lcp_ruby/services/built_in_transforms.rb,
lib/lcp_ruby/tasks/destroy_order_resolver.rb,
lib/lcp_ruby/virtual_fields/virtual_field.rb,
lib/lcp_ruby/workflow/transition_executor.rb,
lib/lcp_ruby/workflow/workflow_definition.rb,
app/controllers/lcp_ruby/health_controller.rb,
lib/generators/lcp_ruby/auditing_generator.rb,
lib/lcp_ruby/authorization/invariant_error.rb,
lib/lcp_ruby/background_jobs/static_source.rb,
lib/lcp_ruby/batch_actions/destroy_service.rb,
lib/lcp_ruby/batch_actions/restore_service.rb,
lib/lcp_ruby/data_source/api_model_concern.rb,
lib/lcp_ruby/data_source/resilient_wrapper.rb,
lib/lcp_ruby/display/renderers/record_link.rb,
lib/lcp_ruby/generators/entity_menu_writer.rb,
lib/lcp_ruby/metadata/aggregate_definition.rb,
lib/lcp_ruby/metadata/presenter_definition.rb,
lib/lcp_ruby/model_factory/enum_applicator.rb,
lib/lcp_ruby/model_factory/tree_applicator.rb,
lib/lcp_ruby/search/relative_date_expander.rb,
lib/lcp_ruby/services/accessors/json_field.rb,
lib/lcp_ruby/virtual_fields/types/array_of.rb,
app/controllers/lcp_ruby/actions_controller.rb,
app/controllers/lcp_ruby/dialogs_controller.rb,
app/controllers/lcp_ruby/landing_controller.rb,
app/controllers/lcp_ruby/metrics_controller.rb,
lib/lcp_ruby/background_jobs/change_handler.rb,
lib/lcp_ruby/background_jobs/steps_executor.rb,
lib/lcp_ruby/display/renderers/boolean_icon.rb,
lib/lcp_ruby/display/renderers/color_swatch.rb,
lib/lcp_ruby/display/renderers/progress_bar.rb,
lib/lcp_ruby/metadata/permission_definition.rb,
lib/lcp_ruby/metadata/validation_definition.rb,
lib/lcp_ruby/metadata/view_group_definition.rb,
lib/lcp_ruby/model_factory/managed_tracking.rb,
lib/lcp_ruby/model_factory/scope_applicator.rb,
lib/lcp_ruby/permissions/contract_validator.rb,
lib/lcp_ruby/presenter/field_value_resolver.rb,
lib/lcp_ruby/search/filter_metadata_builder.rb,
lib/lcp_ruby/types/transforms/normalize_url.rb,
lib/lcp_ruby/widgets/record_source_resolver.rb,
lib/lcp_ruby/workflow/approval/data_builder.rb,
lib/lcp_ruby/workflow/approval/task_manager.rb,
lib/lcp_ruby/workflow/transition_definition.rb,
app/helpers/lcp_ruby/display_template_helper.rb,
lib/generators/lcp_ruby/api_tokens_generator.rb,
lib/generators/lcp_ruby/entity/color_palette.rb,
lib/generators/lcp_ruby/monitoring_generator.rb,
lib/generators/lcp_ruby/role_model_generator.rb,
lib/lcp_ruby/authentication/audit_subscriber.rb,
lib/lcp_ruby/authentication/omniauth_builder.rb,
lib/lcp_ruby/authorization/impersonated_user.rb,
lib/lcp_ruby/background_jobs/handler_factory.rb,
lib/lcp_ruby/condition_services/feature_flag.rb,
lib/lcp_ruby/display/renderers/internal_link.rb,
lib/lcp_ruby/display/renderers/relative_date.rb,
lib/lcp_ruby/metadata/association_definition.rb,
lib/lcp_ruby/record_aliases/metadata_checker.rb,
lib/lcp_ruby/types/transforms/base_transform.rb,
lib/lcp_ruby/virtual_fields/synthetic_marker.rb,
lib/lcp_ruby/widgets/presenter_zone_resolver.rb,
app/controllers/lcp_ruby/auth/base_controller.rb,
app/controllers/lcp_ruby/resources_controller.rb,
lib/generators/lcp_ruby/agent_setup_generator.rb,
lib/generators/lcp_ruby/entity/role_discovery.rb,
lib/lcp_ruby/authentication/provider_registry.rb,
lib/lcp_ruby/authorization/association_lookup.rb,
lib/lcp_ruby/background_jobs/schedule_adapter.rb,
lib/lcp_ruby/condition_services/impersonating.rb,
lib/lcp_ruby/controller/bearer_authentication.rb,
lib/lcp_ruby/custom_fields/contract_validator.rb,
lib/lcp_ruby/display/renderers/workflow_badge.rb,
lib/lcp_ruby/metadata/configuration_validator.rb,
lib/lcp_ruby/model_factory/default_applicator.rb,
lib/lcp_ruby/model_factory/ransack_applicator.rb,
lib/lcp_ruby/permissions/definition_validator.rb,
lib/lcp_ruby/presenter/breadcrumb_path_helper.rb,
lib/lcp_ruby/saved_filters/contract_validator.rb,
lib/lcp_ruby/search/custom_filter_interceptor.rb,
lib/lcp_ruby/search/query_language_serializer.rb,
lib/lcp_ruby/types/transforms/normalize_phone.rb,
lib/lcp_ruby/workflow/approval/step_evaluator.rb,
lib/generators/lcp_ruby/install_auth_generator.rb,
lib/lcp_ruby/authorization/authorization_error.rb,
lib/lcp_ruby/data_source/api_error_placeholder.rb,
lib/lcp_ruby/data_source/api_filter_translator.rb,
lib/lcp_ruby/display/renderers/attachment_link.rb,
lib/lcp_ruby/display/renderers/attachment_list.rb,
lib/lcp_ruby/model_factory/auditing_applicator.rb,
lib/lcp_ruby/model_factory/callback_applicator.rb,
lib/lcp_ruby/model_factory/computed_applicator.rb,
lib/lcp_ruby/model_factory/sequence_applicator.rb,
lib/lcp_ruby/model_factory/workflow_applicator.rb,
lib/lcp_ruby/workflow/approval/cleanup_handler.rb,
lib/lcp_ruby/workflow/approval/discard_handler.rb,
lib/lcp_ruby/workflow/approval/step_definition.rb,
lib/lcp_ruby/workflow/audit_contract_validator.rb,
app/controllers/lcp_ruby/application_controller.rb,
app/controllers/lcp_ruby/dev_toolbar_controller.rb,
lib/generators/lcp_ruby/claude_skills_generator.rb,
lib/generators/lcp_ruby/custom_fields_generator.rb,
lib/generators/lcp_ruby/entity/field_descriptor.rb,
lib/generators/lcp_ruby/saved_filters_generator.rb,
lib/lcp_ruby/authentication/bearer_jwt_verifier.rb,
lib/lcp_ruby/authorization/permission_evaluator.rb,
lib/lcp_ruby/background_jobs/contract_validator.rb,
lib/lcp_ruby/background_jobs/unique_key_builder.rb,
lib/lcp_ruby/batch_actions/batch_action_handler.rb,
lib/lcp_ruby/metadata/virtual_column_definition.rb,
lib/lcp_ruby/model_factory/aggregate_applicator.rb,
lib/lcp_ruby/model_factory/label_method_builder.rb,
lib/lcp_ruby/model_factory/transform_applicator.rb,
lib/lcp_ruby/tasks/permission_resolve_formatter.rb,
lib/lcp_ruby/workflow/approval/system_evaluator.rb,
lib/lcp_ruby/workflow/transition_action_builder.rb,
lib/lcp_ruby/workflow/transition_label_resolver.rb,
lib/lcp_ruby/authentication/oidc_bearer_resolver.rb,
lib/lcp_ruby/display/renderers/workflow_timeline.rb,
lib/lcp_ruby/metadata/model_inheritance_resolver.rb,
lib/lcp_ruby/model_factory/array_type_applicator.rb,
lib/lcp_ruby/model_factory/attachment_applicator.rb,
lib/lcp_ruby/model_factory/userstamps_applicator.rb,
lib/lcp_ruby/model_factory/validation_applicator.rb,
lib/lcp_ruby/saved_filters/stale_field_validator.rb,
lib/lcp_ruby/workflow/approval/approver_resolver.rb,
app/controllers/concerns/lcp_ruby/zone_resolution.rb,
app/controllers/lcp_ruby/auth/sessions_controller.rb,
app/controllers/lcp_ruby/custom_fields_controller.rb,
app/controllers/lcp_ruby/impersonation_controller.rb,
app/controllers/lcp_ruby/saved_filters_controller.rb,
lib/generators/lcp_ruby/background_jobs_generator.rb,
lib/generators/lcp_ruby/entity/field_token_parser.rb,
lib/generators/lcp_ruby/host_controller_generator.rb,
lib/lcp_ruby/background_jobs/declarative/registry.rb,
lib/lcp_ruby/condition_services/current_user_role.rb,
lib/lcp_ruby/display/renderers/attachment_preview.rb,
lib/lcp_ruby/metadata/display_template_definition.rb,
lib/lcp_ruby/model_factory/association_applicator.rb,
lib/lcp_ruby/model_factory/positioning_applicator.rb,
lib/lcp_ruby/model_factory/soft_delete_applicator.rb,
lib/lcp_ruby/workflow/approval/activation_handler.rb,
lib/lcp_ruby/workflow/approval/contract_validator.rb,
lib/lcp_ruby/workflow/approval/resolution_handler.rb,
app/controllers/concerns/lcp_ruby/dialog_rendering.rb,
app/controllers/lcp_ruby/approval_tasks_controller.rb,
app/controllers/lcp_ruby/auth/callbacks_controller.rb,
app/controllers/lcp_ruby/auth/passwords_controller.rb,
lib/generators/lcp_ruby/batch_operations_generator.rb,
lib/lcp_ruby/search/parameterized_scope_applicator.rb,
lib/lcp_ruby/workflow/approval/approval_definition.rb,
lib/generators/lcp_ruby/gapfree_sequences_generator.rb,
lib/generators/lcp_ruby/permission_source_generator.rb,
lib/lcp_ruby/authorization/misconfigured_page_error.rb,
lib/lcp_ruby/background_jobs/triggers/event_trigger.rb,
lib/lcp_ruby/batch_actions/custom_action_dispatcher.rb,
app/controllers/concerns/lcp_ruby/page_authorization.rb,
lib/generators/lcp_ruby/oidc_role_mappings_generator.rb,
lib/generators/lcp_ruby/workflow_approvals_generator.rb,
lib/generators/lcp_ruby/workflow_audit_log_generator.rb,
lib/lcp_ruby/background_jobs/declarative/base_action.rb,
lib/lcp_ruby/custom_fields/definition_change_handler.rb,
lib/lcp_ruby/model_factory/virtual_column_applicator.rb,
lib/generators/lcp_ruby/workflow_definition_generator.rb,
lib/lcp_ruby/authorization/inherited_parent_validator.rb,
lib/lcp_ruby/model_factory/api_association_applicator.rb,
app/controllers/lcp_ruby/auth/registrations_controller.rb,
lib/lcp_ruby/authorization/runtime_invariant_validator.rb,
lib/lcp_ruby/batch_actions/permanently_destroy_service.rb,
lib/lcp_ruby/model_factory/service_accessor_applicator.rb,
app/controllers/concerns/lcp_ruby/form_action_execution.rb,
lib/lcp_ruby/background_jobs/triggers/trigger_installer.rb,
lib/lcp_ruby/authorization/invariant_check/configuration.rb,
lib/lcp_ruby/display/renderers/concerns/workflow_helpers.rb,
lib/lcp_ruby/background_jobs/declarative/run_scope_action.rb,
lib/lcp_ruby/presenter/includes_resolver/loading_strategy.rb,
lib/lcp_ruby/background_jobs/declarative/fire_event_action.rb,
lib/lcp_ruby/display/renderers/concerns/attachment_helpers.rb,
lib/lcp_ruby/presenter/includes_resolver/strategy_resolver.rb,
lib/lcp_ruby/background_jobs/declarative/call_webhook_action.rb,
lib/lcp_ruby/presenter/includes_resolver/dependency_collector.rb,
lib/lcp_ruby/presenter/includes_resolver/association_dependency.rb,
lib/lcp_ruby/model_factory/inherited_parent_validator_applicator.rb,
lib/lcp_ruby/background_jobs/declarative/send_notification_action.rb

Defined Under Namespace

Modules: Actions, Aggregates, ApiTokens, AssetCopier, AssociationFkType, AssociationJoinColumn, AssociationOptionsBuilder, Auditing, Auth, Authentication, Authorization, AuthorizedController, BackgroundJobs, BatchActions, BulkUpdater, CLI, ConditionHelper, ConditionServices, Conditions, Controller, CustomFields, DashboardHelper, DataSource, DevToolbar, DevToolbarHelper, DialogHelper, DialogRendering, Display, DisplayHelper, DisplayTemplateHelper, Dsl, Dynamic, DynamicReferences, EmbedProviders, Events, Export, FormActionExecution, FormHelper, GemPaths, Generators, GroupedQuery, GroupedQueryHelper, Groups, HashUtils, I18nCheck, I18nPayloadHelper, Import, Kanban, LayoutHelper, LinkThroughHelper, Menu, Metadata, Metrics, ModelFactory, OidcButtonHelper, PageAuthorization, Pages, PathUtils, Permissions, Presenter, RecordAliases, Roles, Routing, SavedFilters, Search, SearchHelper, Sequences, Services, Sort, Tasks, TreeHelper, Types, UrlSafety, UserSnapshot, ViewSlotHelper, ViewSlots, VirtualColumns, VirtualFields, Widgets, Workflow, ZoneResolution Classes: ActionsController, ApplicationController, ApprovalTasksController, ArrayQuery, ConditionError, ConditionEvaluator, ConditionServiceRegistry, Configuration, Current, CustomFieldsController, DevToolbarController, DialogsController, Engine, Error, HealthController, I18nLint, ImpersonatedUser, ImpersonationController, JsonItemWrapper, LandingController, MenuRenderError, MetadataError, MetricsController, ResourcesController, SavedFiltersController, SchemaError, SearchResult, ServiceError, SkillsInstaller, User

Constant Summary collapse

VERSION =
"0.1.0"
RESERVED_ROUTE_SEGMENTS =

Route segments that must not be used as record alias names or slug field values. Derived from config/routes.rb — includes both routing-reserved segments (intercepted by explicit GET routes before /:id) and clarity-reserved segments (would create confusing URLs even if technically routable).

Shared between:

  • ModelFactory::Builder (exclusion validation on slug fields)

  • RecordAliases::Setup / ConfigurationValidator (alias name validation)

%w[
  new
  edit
  saved-filters
  custom-fields
  actions
  batch_actions
  select_options
  inline_create
  inline_create_form
  parse_ql
  filter_fields
  batch_count
  batch_selection
  export_fields
  export_profiles
  import_fields
  import_profiles
  evaluate_conditions
  restore
  permanently_destroy
  reorder
  reparent
  zones
  transitions
  approval_tasks
].freeze

Class Method Summary collapse

Class Method Details

._drain_models_loaded_callbacks!(loader) ⇒ Object

Internal: drains registered callbacks. Called from ‘Engine.load_metadata!` once the model build phase is complete. Callbacks are NOT removed from the list — they fire on every subsequent drain too, so initializer-time registrations survive `LcpRuby.reload!` without re-registration.



489
490
491
# File 'lib/lcp_ruby.rb', line 489

def _drain_models_loaded_callbacks!(loader)
  @models_loaded_callbacks.each { |cb| cb.call(loader) }
end

.booted?Boolean

Returns:

  • (Boolean)


451
452
453
# File 'lib/lcp_ruby.rb', line 451

def booted?
  @booted == true
end

.check_action_text_compat!Object

Boot-time guard for #17. ‘lcp new` runs `rails new –skip-action-text`, so apps that subsequently declare `field: name: foo, type: rich_text` silently render the form input as a plain textarea (no WYSIWYG). The underlying schema is still `text`, so nothing crashes — but the editor is invisible until the host explicitly installs Action Text. Surface the gap once at boot, naming each affected field and giving the exact remediation steps.



613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
# File 'lib/lcp_ruby.rb', line 613

def check_action_text_compat!
  return if Object.const_defined?(:ActionText)

  affected = []
  loader.model_definitions.each_value do |model|
    model.fields.each do |field|
      next unless field.type == "rich_text"
      affected << "#{model.name}.#{field.name}"
    end
  end
  return if affected.empty?

  Rails.logger.warn(<<~MSG) if defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger
    [LcpRuby] Action Text is not installed but the following fields use type :rich_text:
      #{affected.map { |f| "- #{f}" }.join("\n  ")}
    These fields render as plain textareas — no WYSIWYG editor will appear in forms.

    To enable rich text editing:
      1. Run: bin/rails action_text:install
      2. Run: bin/rails db:migrate
      3. Restart the server.

    If your config/application.rb uses selective requires (e.g. the app was
    bootstrapped with `--skip-action-text`), also add
    `require "action_text/engine"` to the require list before step 1.

    Or change the affected fields to :text to suppress this warning.
  MSG
end

.check_servicesObject



594
595
596
# File 'lib/lcp_ruby.rb', line 594

def check_services
  Services::Checker.new(loader.model_definitions).check
end

.check_services!Object



598
599
600
601
602
603
604
# File 'lib/lcp_ruby.rb', line 598

def check_services!
  result = check_services
  unless result.valid?
    raise ServiceError, "Missing service references:\n#{result.errors.map { |e| "  - #{e}" }.join("\n")}"
  end
  result
end

.configurationObject



555
556
557
# File 'lib/lcp_ruby.rb', line 555

def configuration
  @configuration ||= Configuration.new
end

.configure {|configuration| ... } ⇒ Object

Yields:



559
560
561
# File 'lib/lcp_ruby.rb', line 559

def configure
  yield(configuration)
end

.define_model(name, &block) ⇒ Object



571
572
573
574
575
576
# File 'lib/lcp_ruby.rb', line 571

def define_model(name, &block)
  builder = Dsl::ModelBuilder.new(name)
  builder.instance_eval(&block)
  hash = builder.to_hash
  Metadata::ModelDefinition.from_hash(hash)
end

.define_presenter(name, &block) ⇒ Object



587
588
589
590
591
592
# File 'lib/lcp_ruby.rb', line 587

def define_presenter(name, &block)
  builder = Dsl::PresenterBuilder.new(name)
  builder.instance_eval(&block)
  hash = builder.to_hash
  Metadata::PresenterDefinition.from_hash(hash)
end

.define_type(name, &block) ⇒ Object



578
579
580
581
582
583
584
585
# File 'lib/lcp_ruby.rb', line 578

def define_type(name, &block)
  builder = Dsl::TypeBuilder.new(name)
  builder.instance_eval(&block)
  hash = builder.to_hash
  type_def = Types::TypeDefinition.from_hash(hash)
  Types::TypeRegistry.register(type_def.name, type_def)
  type_def
end

.embed_csp_sourcesObject



643
644
645
# File 'lib/lcp_ruby.rb', line 643

def embed_csp_sources
  configuration.embed_csp_sources
end

.enqueue_job(**args) ⇒ Object

Convenience method for enqueuing background jobs.



667
668
669
# File 'lib/lcp_ruby.rb', line 667

def enqueue_job(**args)
  BackgroundJobs::Enqueue.call(**args)
end

.generator_context?Boolean

Returns true when the process was invoked via ‘rails generate`. Used by Setup modules to downgrade hard errors to warnings so generators can boot the app and create the missing files (chicken-and-egg problem).

Returns:

  • (Boolean)


659
660
661
662
663
# File 'lib/lcp_ruby.rb', line 659

def generator_context?
  defined?(Rails::Command) &&
    $PROGRAM_NAME.end_with?("/rails") &&
    ARGV.first&.match?(/\Ag(enerate)?\z/)
end

.json_column_typeObject



651
652
653
# File 'lib/lcp_ruby.rb', line 651

def json_column_type
  postgresql? ? :jsonb : :json
end

.loaderObject



563
564
565
# File 'lib/lcp_ruby.rb', line 563

def loader
  @loader ||= Metadata::Loader.new(configuration.)
end

.on_models_loaded(&block) ⇒ Object

Register a callback fired on every ‘Engine.load_metadata!`, after all dynamic models have been built and per-model `on_model_ready` hooks have run. The list is drained inside `Engine.load_metadata!` immediately before `Authorization::RuntimeInvariantValidator` runs, so any host code that registers late-bound scopes in this hook is guaranteed to have executed before AUTH-001 checks `klass.respond_to?(method)`.

**Persistent across reload.** Callbacks registered here are NOT consumed on drain — they re-fire on every subsequent ‘Engine.load_metadata!` call. This means a host registers once in `config/initializers/lcp_ruby.rb` and the registration survives `LcpRuby.reload!` cleanly. Re-firing is what makes the install-generator pattern (host’s ‘Actions::ActionRegistry.discover!` / `Events::HandlerRegistry.discover!`) repopulate registries that `LcpRuby.reset!` cleared.

See docs/design/authorization_hardening.md § “Boot lifecycle: ‘LcpRuby.on_models_loaded`” and docs/design/boot_reload_lifecycle.md § Q7.

Mirrors ‘LcpRuby::Configuration#on_model_ready` (per-model hook) but at the global “every model is now built” level.

Raises:

  • (ArgumentError)


478
479
480
481
482
# File 'lib/lcp_ruby.rb', line 478

def on_models_loaded(&block)
  raise ArgumentError, "on_models_loaded requires a block" unless block_given?

  @models_loaded_callbacks << block
end

.postgresql?Boolean

Returns:

  • (Boolean)


647
648
649
# File 'lib/lcp_ruby.rb', line 647

def postgresql?
  ActiveRecord::Base.connection.adapter_name.downcase.include?("postgresql")
end

.record_error(exception, subsystem:, **context) ⇒ Object

The unified error-recording helper for the platform. ALWAYS prefer this over ‘Rails.logger.error` for any swallowed exception or detected invariant violation that should be observable in production:

- Increments Prometheus counter `lcp_ruby_errors_total{error_class, subsystem}`
- Persists to `lcp_error_logs` with SHA256 fingerprint dedup +
  1-second rate-limit window (no DB write storms)
- Captures request URL/user_id/IP if `error_log_capture_request_context = true`
- Surfaces in the monitoring dashboard (KPI card + recent-errors list)
- Available to host-app subscribers via
  `ActiveSupport::Notifications.subscribe("error.lcp_ruby")`

Canonical 3-line idiom (see CLAUDE.md “Error Handling” and docs/design/monitoring.md:333-345) — raise in dev/test, record in production, return fallback:

rescue SpecificError => e
  raise unless Rails.env.production?
  LcpRuby.record_error(e, subsystem: "data_source", model: model_name)
  fallback_value
end

For invariant detection (not rescue), construct the error and pass it:

unless invariant_holds?
  error = MySubsystemError.new("...")
  raise error unless defined?(Rails) && Rails.env.production?
  LcpRuby.record_error(error, subsystem: "...", **context)
  return safe_fallback
end

Known ‘subsystem` values are listed in docs/design/monitoring.md:239-251. When adding a new subsystem, update that table.

Parameters:

  • exception (Exception)

    the exception to record (may be freshly constructed for invariant-detection cases — ‘backtrace` may be nil, which is handled gracefully)

  • subsystem (String)

    the subsystem that caught the error (e.g., “data_source”, “renderer”, “scope_builder”)

  • context (Hash)

    additional context (model, field, record_id, etc.)



533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
# File 'lib/lcp_ruby.rb', line 533

def record_error(exception, subsystem:, **context)
  payload = {
    exception: exception,
    error_class: exception.class.name,
    message: exception.message,
    stacktrace: exception.backtrace&.first(20) || [],
    subsystem: subsystem.to_s
  }.merge(context)

  # Inject request context when enabled and available
  if configuration.error_log_capture_request_context && defined?(ActionDispatch::Request)
    request = Thread.current[:lcp_ruby_current_request]
    if request
      payload[:request_url] = request.original_url
      payload[:user_id] = Thread.current[:lcp_ruby_current_user_id]
      payload[:ip] = request.remote_ip
    end
  end

  ActiveSupport::Notifications.instrument("error.lcp_ruby", payload)
end

.registryObject



567
568
569
# File 'lib/lcp_ruby.rb', line 567

def registry
  @registry ||= ModelFactory::Registry.new
end

.reset!Object

Full reset — used by tests for hard isolation between runs. Blanks ‘@configuration` (host settings) and `@models_loaded_callbacks` so the next `LcpRuby.configuration` access returns a fresh defaults- only Configuration. Production reload paths (`Engine.reload!`) call the softer `reset_for_reload!` instead, which preserves host settings — Rails initializers fire only once per process, so blanking `@configuration` on every reload would lose everything the host set in `config/initializers/lcp_ruby.rb`. See docs/design/boot_reload_lifecycle.md § Q7.



687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
# File 'lib/lcp_ruby.rb', line 687

def reset!
  @booted = false
  @configuration = nil
  @loader = nil
  @registry = nil
  @models_loaded_callbacks = []
  Authorization::RuntimeInvariantValidator.last_run = nil if defined?(Authorization::RuntimeInvariantValidator)
  Types::TypeRegistry.clear!
  ConditionServiceRegistry.clear!
  Events::HandlerRegistry.clear!
  Actions::ActionRegistry.clear!
  Display::RendererRegistry.clear!
  Authorization::PolicyFactory.clear!
  Services::Registry.clear!
  CustomFields::Registry.clear!
  Roles::Registry.clear!
  Permissions::Registry.clear!
  Groups::Registry.clear!
  Auditing::Registry.clear!
  Auditing::AuditWriter.clear_cache!
  SavedFilters::Registry.clear!
  DataSource::Registry.clear!
  ViewSlots::Registry.clear!
  Pages::Resolver.clear!
  Pages::Registry.clear!
  Widgets::PresenterZoneResolver.reset_cache!
  Workflow::Registry.clear!
  Workflow::AuditRegistry.clear!
  Workflow::AuditWriter.clear_cache!
  Workflow::Approval::Registry.clear!
  BackgroundJobs::Registry.clear!
  BackgroundJobs::Declarative::Registry.clear!
  BatchActions.instance_variable_set(:@background_job_registered, nil)
  Metrics::Subscriber.clear!
  Metrics::CollectorRegistry.clear!
  Metrics::RateLimiter.clear!
  # NOTE: ModelFactory::ManagedTracking is intentionally NOT reset here.
  # The tracking summary represents process-lifetime state ("which AR
  # macros / columns LCP installed on which host class in this process"),
  # not per-boot state. Wiping it would defeat the already_managed?
  # reload guard — the next apply! pass would re-execute belongs_to and
  # stack a duplicate set of callbacks alongside the originals.
  # Call ManagedTracking.reset_all! explicitly from tests that need a
  # clean slate.

  # Remove dynamic constants to avoid "already initialized" warnings
  Dynamic.constants.each do |const|
    Dynamic.send(:remove_const, const)
  end
end

.reset_for_reload!Object

Soft reset used by ‘Engine.reload!`. Mirrors `reset!` for everything that’s metadata-derived (registries, dynamic constants, registries that are fully repopulated by ‘load_metadata!` and the `on_models_loaded` drain) — but preserves state that came from host code in `config/initializers/lcp_ruby.rb`:

  • ‘@configuration` — host’s ‘LcpRuby.configure { … }` block fires only once per Rails process, so blanking it on every reload would lose `metadata_path`, `role_method`, `auth_*`, on_model_ready callbacks, registered embed providers, etc.

  • ‘@models_loaded_callbacks` — host’s ‘LcpRuby.on_models_loaded { … }` block from the install-generator pattern is registered once at boot; the non-consuming drain semantics (see `_drain_models_loaded_callbacks!`) make it re-fire on every reload. Blanking the list here would defeat that.

See docs/design/boot_reload_lifecycle.md § Q7 for the full rationale of why ‘Engine.reload!` cannot use the test-grade `reset!`.



756
757
758
759
760
761
762
# File 'lib/lcp_ruby.rb', line 756

def reset_for_reload!
  preserved_configuration = @configuration
  preserved_callbacks = @models_loaded_callbacks
  reset!
  @configuration = preserved_configuration
  @models_loaded_callbacks = preserved_callbacks
end

.user_roles(user) ⇒ Object

Returns the user’s roles as an array of strings. Centralises the role-resolution pattern used across controllers, helpers, and lib classes.



673
674
675
676
# File 'lib/lcp_ruby.rb', line 673

def user_roles(user)
  return [] unless user
  Array(user.send(configuration.role_method)).map(&:to_s)
end