Class: DhanHQ::Skills::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/DhanHQ/skills/registry.rb

Overview

Registry for skill definitions.

Maps skill names to their classes. Skills are registered explicitly or discovered via conventions.

Examples:

Register a skill

DhanHQ::Skills::Registry.register("buy_atm_call", BuyAtmCall)

Find a skill

skill = DhanHQ::Skills::Registry.find("buy_atm_call")
result = skill.call(symbol: "NIFTY", expiry: "2026-01-30")

Class Method Summary collapse

Class Method Details

.call(name, args = {}) ⇒ Hash

Execute a skill by name with the given arguments.

Parameters:

  • name (String)

    skill name

  • args (Hash) (defaults to: {})

    skill parameters

Returns:

  • (Hash)

    context with all accumulated state



44
45
46
# File 'lib/DhanHQ/skills/registry.rb', line 44

def call(name, args = {})
  find(name).new.call(args)
end

.clear!Object

Clear all registered skills (for testing).



71
72
73
# File 'lib/DhanHQ/skills/registry.rb', line 71

def clear!
  @skills = {}
end

.find(name) ⇒ Class

Find a skill by name.

Parameters:

  • name (String)

    skill name

Returns:

  • (Class)

    the skill class

Raises:

  • (KeyError)

    if skill is not found



35
36
37
# File 'lib/DhanHQ/skills/registry.rb', line 35

def find(name)
  skills.fetch(name.to_s) { raise KeyError, "Unknown skill: #{name}" }
end

.listArray<Hash>

List all registered skills with metadata.

Returns:

  • (Array<Hash>)


58
59
60
61
62
63
64
65
66
67
68
# File 'lib/DhanHQ/skills/registry.rb', line 58

def list
  skills.map do |name, klass|
    instance = klass.new
    {
      name: name,
      description: instance.description,
      params: instance.param_definitions,
      steps: klass.steps.map { |s| s[:name] }
    }
  end
end

.load_builtinsObject

Load built-in skills from the builtin directory and register them.



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/DhanHQ/skills/registry.rb', line 76

def load_builtins
  Dir[File.join(__dir__, "builtin", "*.rb")].each do |file|
    require file
  end

  # Auto-register any Builtin classes that inherit from Base
  DhanHQ::Skills::Builtin.constants.each do |const_name|
    klass = DhanHQ::Skills::Builtin.const_get(const_name)
    next unless klass.is_a?(Class) && klass < Base

    name = const_name.to_s
                     .gsub(/([a-z])([A-Z])/, '\1_\2')
                     .downcase
    register(name, klass) unless skills.key?(name)
  end
end

.namesArray<String>

List all registered skill names.

Returns:

  • (Array<String>)


51
52
53
# File 'lib/DhanHQ/skills/registry.rb', line 51

def names
  skills.keys.sort
end

.register(name, klass) ⇒ Object

Register a skill class by name.

Parameters:

  • name (String)

    skill name

  • klass (Class)

    skill class inheriting from Base

Raises:

  • (ArgumentError)

    if the class is not a Base subclass



24
25
26
27
28
# File 'lib/DhanHQ/skills/registry.rb', line 24

def register(name, klass)
  raise ArgumentError, "Skill class must inherit from DhanHQ::Skills::Base" unless klass < Base

  skills[name.to_s] = klass
end