Module: Spurline::DSL::Tools::ClassMethods

Defined in:
lib/spurline/dsl/tools.rb

Constant Summary collapse

IDEMPOTENCY_OPTION_KEYS =
%i[
  idempotent
  idempotency_key
  idempotency_ttl
  idempotency_key_fn
].freeze

Instance Method Summary collapse

Instance Method Details

#idempotency_configObject

Effective per-tool idempotency options from DSL config.



66
67
68
69
70
71
72
73
74
75
# File 'lib/spurline/dsl/tools.rb', line 66

def idempotency_config
  tool_config[:configs].each_with_object({}) do |(tool_name, config), result|
    next unless config.is_a?(Hash)

    options = symbolize_hash(config).slice(*IDEMPOTENCY_OPTION_KEYS)
    next if options.empty?

    result[tool_name.to_sym] = options
  end
end

#permissions_configObject

Effective permissions applied by Tools::Runner. Merge order: spur defaults -> agent inline config -> YAML overrides.



79
80
81
82
83
84
85
# File 'lib/spurline/dsl/tools.rb', line 79

def permissions_config
  merged = {}
  deep_merge_permissions!(merged, spur_default_permissions)
  deep_merge_permissions!(merged, inline_tool_permissions)
  deep_merge_permissions!(merged, yaml_permissions)
  merged
end

#tool_configObject



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/spurline/dsl/tools.rb', line 46

def tool_config
  expand_pending_toolkits!
  own = @tool_config || { names: [], configs: {} }
  if superclass.respond_to?(:tool_config)
    inherited = superclass.tool_config
    {
      names: (inherited[:names] + own[:names]).uniq,
      configs: inherited[:configs].merge(own[:configs]),
    }
  else
    own
  end
end

#tool_config_for(tool_name) ⇒ Object

Returns per-tool configuration for a specific tool.



61
62
63
# File 'lib/spurline/dsl/tools.rb', line 61

def tool_config_for(tool_name)
  tool_config[:configs][tool_name.to_sym] || {}
end

#toolkits(*toolkit_names, **overrides) ⇒ Object

Include one or more toolkits by name. Toolkit expansion is deferred until tool_config is accessed, so toolkits can be registered after agent classes are defined (supports any boot order).

toolkits :git, :linear
toolkits :provisioning, provisioning: { scoped: true }


41
42
43
44
# File 'lib/spurline/dsl/tools.rb', line 41

def toolkits(*toolkit_names, **overrides)
  @pending_toolkits ||= []
  @pending_toolkits << { names: toolkit_names.map(&:to_sym), overrides: overrides }
end

#tools(*tool_names, **tool_configs) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/spurline/dsl/tools.rb', line 24

def tools(*tool_names, **tool_configs)
  @tool_config ||= { names: [], configs: {} }
  tool_names.each { |name| @tool_config[:names] << name.to_sym }
  tool_configs.each do |name, config|
    @tool_config[:names] << name.to_sym
    existing = @tool_config[:configs][name.to_sym]
    @tool_config[:configs][name.to_sym] = existing ? existing.merge(config) : config
  end
end