Class: DecisionAgent::Versioning::VersionManager

Inherits:
Object
  • Object
show all
Defined in:
lib/decision_agent/versioning/version_manager.rb

Overview

High-level service for managing rule versions Provides a framework-agnostic API using pluggable storage adapters

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(adapter: nil) ⇒ VersionManager

Initialize with a storage adapter

Parameters:

  • adapter (Adapter) (defaults to: nil)

    The storage adapter to use



12
13
14
# File 'lib/decision_agent/versioning/version_manager.rb', line 12

def initialize(adapter: nil)
  @adapter = adapter || default_adapter
end

Instance Attribute Details

#adapterObject (readonly)

Returns the value of attribute adapter.



8
9
10
# File 'lib/decision_agent/versioning/version_manager.rb', line 8

def adapter
  @adapter
end

Instance Method Details

#compare(version_id_1:, version_id_2:) ⇒ Hash

Compare two versions

Parameters:

  • version_id_1 (String, Integer)

    First version

  • version_id_2 (String, Integer)

    Second version

Returns:

  • (Hash)

    Comparison result



85
86
87
88
89
90
# File 'lib/decision_agent/versioning/version_manager.rb', line 85

def compare(version_id_1:, version_id_2:)
  @adapter.compare_versions(
    version_id_1: version_id_1,
    version_id_2: version_id_2
  )
end

#delete_tag(model_id:, name:) ⇒ Boolean

Delete a tag by name.

Parameters:

  • model_id (String)

    The rule/model identifier

  • name (String)

    The tag name

Returns:

  • (Boolean)

    True if deleted, false if the tag did not exist



144
145
146
# File 'lib/decision_agent/versioning/version_manager.rb', line 144

def delete_tag(model_id:, name:)
  @adapter.delete_tag(model_id: model_id, name: name)
end

#delete_version(version_id:) ⇒ Boolean

Delete a specific version

Parameters:

  • version_id (String, Integer)

    The version to delete

Returns:

  • (Boolean)

    True if deleted successfully



111
112
113
# File 'lib/decision_agent/versioning/version_manager.rb', line 111

def delete_version(version_id:)
  @adapter.delete_version(version_id: version_id)
end

#get_active_version(rule_id:) ⇒ Hash?

Get the currently active version for a rule

Parameters:

  • rule_id (String)

    The rule identifier

Returns:

  • (Hash, nil)

    The active version or nil



67
68
69
# File 'lib/decision_agent/versioning/version_manager.rb', line 67

def get_active_version(rule_id:)
  @adapter.get_active_version(rule_id: rule_id)
end

#get_history(rule_id:) ⇒ Hash

Get version history with metadata

Parameters:

  • rule_id (String)

    The rule identifier

Returns:

  • (Hash)

    History with statistics



95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/decision_agent/versioning/version_manager.rb', line 95

def get_history(rule_id:)
  versions = get_versions(rule_id: rule_id)

  {
    rule_id: rule_id,
    total_versions: versions.length,
    active_version: get_active_version(rule_id: rule_id),
    versions: versions,
    created_at: versions.last&.dig(:created_at),
    updated_at: versions.first&.dig(:created_at)
  }
end

#get_tag(model_id:, name:) ⇒ Hash?

Resolve a tag to its version hash, or nil if the tag does not exist.

Parameters:

  • model_id (String)

    The rule/model identifier

  • name (String)

    The tag name

Returns:

  • (Hash, nil)

    Tag hash or nil



129
130
131
# File 'lib/decision_agent/versioning/version_manager.rb', line 129

def get_tag(model_id:, name:)
  @adapter.get_tag(model_id: model_id, name: name)
end

#get_version(version_id:) ⇒ Hash?

Get a specific version

Parameters:

  • version_id (String, Integer)

    The version identifier

Returns:

  • (Hash, nil)

    The version or nil



60
61
62
# File 'lib/decision_agent/versioning/version_manager.rb', line 60

def get_version(version_id:)
  @adapter.get_version(version_id: version_id)
end

#get_versions(rule_id:, limit: nil) ⇒ Array<Hash>

Get all versions for a rule

Parameters:

  • rule_id (String)

    The rule identifier

  • limit (Integer, nil) (defaults to: nil)

    Optional limit

Returns:

  • (Array<Hash>)

    Array of versions



46
47
48
# File 'lib/decision_agent/versioning/version_manager.rb', line 46

def get_versions(rule_id:, limit: nil)
  @adapter.list_versions(rule_id: rule_id, limit: limit)
end

#list_all_versions(limit: nil) ⇒ Array<Hash>

Get all versions across all rules

Parameters:

  • limit (Integer, nil) (defaults to: nil)

    Optional limit

Returns:

  • (Array<Hash>)

    Array of versions



53
54
55
# File 'lib/decision_agent/versioning/version_manager.rb', line 53

def list_all_versions(limit: nil)
  @adapter.list_all_versions(limit: limit)
end

#list_tags(model_id:) ⇒ Array<Hash>

List all tags for a model.

Parameters:

  • model_id (String)

    The rule/model identifier

Returns:

  • (Array<Hash>)

    Tag hashes sorted by name



136
137
138
# File 'lib/decision_agent/versioning/version_manager.rb', line 136

def list_tags(model_id:)
  @adapter.list_tags(model_id: model_id)
end

#rollback(version_id:, performed_by: "system") ⇒ Hash

Rollback to a previous version (activate it without creating a duplicate)

Parameters:

  • version_id (String, Integer)

    The version to rollback to

  • performed_by (String) (defaults to: "system")

    User performing the rollback

Returns:

  • (Hash)

    The activated version



75
76
77
78
79
# File 'lib/decision_agent/versioning/version_manager.rb', line 75

def rollback(version_id:, performed_by: "system")
  # Simply activate the previous version without creating a duplicate
  # The version history already contains the full record
  @adapter.activate_version(version_id: version_id)
end

#save_version(rule_id:, rule_content:, created_by: "system", changelog: nil, tag: nil) ⇒ Hash

Save a new version of a rule

Parameters:

  • rule_id (String)

    Unique identifier for the rule

  • rule_content (Hash)

    The rule definition

  • created_by (String) (defaults to: "system")

    User who created this version

  • changelog (String) (defaults to: nil)

    Description of changes

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

    Optional tag name to apply to the new version at creation time

Returns:

  • (Hash)

    The created version



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/decision_agent/versioning/version_manager.rb', line 23

def save_version(rule_id:, rule_content:, created_by: "system", changelog: nil, tag: nil)
  validate_rule_content!(rule_content)

   = {
    created_by: created_by,
    changelog: changelog || generate_default_changelog(rule_id)
  }

  version = @adapter.create_version(
    rule_id: rule_id,
    content: rule_content,
    metadata: 
  )

  tag!(rule_id, version[:id], tag) if tag

  version
end

#tag!(model_id, version_id, name) ⇒ Hash

Tag a specific version after the fact. Creates the tag if it does not exist; re-points it if the name is already used.

Parameters:

  • model_id (String)

    The rule/model identifier

  • version_id (String)

    The version to tag

  • name (String)

    The tag name

Returns:

  • (Hash)

    The tag ({ name:, version_id:, created_at: })



121
122
123
# File 'lib/decision_agent/versioning/version_manager.rb', line 121

def tag!(model_id, version_id, name)
  @adapter.create_tag(model_id: model_id, version_id: version_id, name: name)
end