Module: Inquirex

Defined in:
lib/inquirex.rb,
lib/inquirex/dsl.rb,
lib/inquirex/node.rb,
lib/inquirex/engine.rb,
lib/inquirex/errors.rb,
lib/inquirex/answers.rb,
lib/inquirex/version.rb,
lib/inquirex/evaluator.rb,
lib/inquirex/rules/all.rb,
lib/inquirex/rules/any.rb,
lib/inquirex/definition.rb,
lib/inquirex/rules/base.rb,
lib/inquirex/transition.rb,
lib/inquirex/accumulator.rb,
lib/inquirex/widget_hint.rb,
lib/inquirex/rules/equals.rb,
lib/inquirex/rules/contains.rb,
lib/inquirex/rules/less_than.rb,
lib/inquirex/rules/not_empty.rb,
lib/inquirex/widget_registry.rb,
lib/inquirex/dsl/flow_builder.rb,
lib/inquirex/dsl/rule_helpers.rb,
lib/inquirex/dsl/step_builder.rb,
lib/inquirex/rules/greater_than.rb,
lib/inquirex/validation/adapter.rb,
lib/inquirex/graph/mermaid_exporter.rb,
lib/inquirex/engine/state_serializer.rb,
lib/inquirex/validation/null_adapter.rb

Overview

Declarative, rules-driven questionnaire engine for building conditional intake forms, qualification wizards, and branching surveys.

Examples:

Define a flow

definition = Inquirex.define id: "tax-intake-2025" do
  meta title: "Tax Preparation Intake", subtitle: "Let's understand your situation"
  start :filing_status

  ask :filing_status do
    type :enum
    question "What is your filing status?"
    options single: "Single", married_jointly: "Married Filing Jointly"
    transition to: :dependents
  end

  ask :dependents do
    type :integer
    question "How many dependents?"
    default 0
    transition to: :done
  end

  say :done do
    text "Thank you!"
  end
end

engine = Inquirex::Engine.new(definition)
engine.answer("single")
engine.answer(2)
engine.advance              # past the :done say step
engine.finished?            # => true

JSON round-trip

json = definition.to_json
restored = Inquirex::Definition.from_json(json)

Defined Under Namespace

Modules: DSL, Errors, Graph, Rules, Validation, WidgetRegistry Classes: Accumulation, Accumulator, Answers, Definition, Engine, Evaluator, Node, Transition, WidgetHint

Constant Summary collapse

VERSION =
"0.3.1"

Class Method Summary collapse

Class Method Details

.define(id: nil, version: "1.0.0") { ... } ⇒ Definition

Builds an immutable Definition from the declarative DSL block.

Parameters:

  • id (String, nil) (defaults to: nil)

    optional flow identifier

  • version (String) (defaults to: "1.0.0")

    semver (default: “1.0.0”)

Yields:

  • context of DSL::FlowBuilder

Returns:



89
90
91
92
93
# File 'lib/inquirex.rb', line 89

def self.define(id: nil, version: "1.0.0", &)
  builder = DSL::FlowBuilder.new(id:, version:)
  builder.instance_eval(&)
  builder.build
end

.load_dsl(text) ⇒ Definition

Evaluates a string of DSL code and returns the resulting definition. Intended for loading flow definitions from files or stored text.

Parameters:

  • text (String)

    Ruby source containing Inquirex.define { … }

Returns:

Raises:



101
102
103
104
105
106
107
108
109
# File 'lib/inquirex.rb', line 101

def self.load_dsl(text)
  # rubocop:disable Security/Eval
  eval(text, TOPLEVEL_BINDING.dup, "(dsl)", 1)
  # rubocop:enable Security/Eval
rescue SyntaxError => e
  raise Errors::DefinitionError, "DSL syntax error: #{e.message}"
rescue StandardError => e
  raise Errors::DefinitionError, "DSL evaluation error: #{e.message}"
end