Module: Wralph::Interfaces::ObjectiveRepository

Defined in:
lib/wralph/interfaces/objective_repository.rb

Class Method Summary collapse

Class Method Details

.adapterObject



21
22
23
# File 'lib/wralph/interfaces/objective_repository.rb', line 21

def self.adapter
  @adapter ||= load_adapter
end

.class_name_to_snake_case(class_name) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/wralph/interfaces/objective_repository.rb', line 61

def self.class_name_to_snake_case(class_name)
  # Convert CamelCase to snake_case
  # Insert underscore before capital letters (except the first one)
  # Then downcase everything
  class_name
    .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
    .gsub(/([a-z\d])([A-Z])/, '\1_\2')
    .downcase
end

.download!(identifier) ⇒ Object



9
10
11
# File 'lib/wralph/interfaces/objective_repository.rb', line 9

def self.download!(identifier)
  adapter.download!(identifier)
end

.load_adapterObject



25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/wralph/interfaces/objective_repository.rb', line 25

def self.load_adapter
  config = Config.load
  source = config.objective_repository.source

  case source
  when 'github_issues'
    Adapters::ObjectiveRepositories::GithubIssues
  when 'custom'
    load_custom_adapter(config.objective_repository.class_name)
  else
    raise "Unknown objective_repository source: #{source}"
  end
end

.load_custom_adapter(class_name) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/wralph/interfaces/objective_repository.rb', line 39

def self.load_custom_adapter(class_name)
  raise "class_name is required when source is 'custom'" if class_name.nil? || class_name.empty?

  # Convert class name to snake_case file path
  file_name = class_name_to_snake_case(class_name)
  adapter_file = File.join(Repo.wralph_dir, "#{file_name}.rb")

  raise "Custom adapter file not found: #{adapter_file}" unless File.exist?(adapter_file)

  # Load the file
  load adapter_file

  # Get the class constant
  begin
    klass = Object.const_get(class_name)
    validate_adapter_interface(klass)
    klass
  rescue NameError => e
    raise "Failed to load custom adapter class '#{class_name}': #{e.message}"
  end
end

.local_file_path(identifier) ⇒ Object



13
14
15
# File 'lib/wralph/interfaces/objective_repository.rb', line 13

def self.local_file_path(identifier)
  adapter.local_file_path(identifier)
end

.reset_adapterObject



17
18
19
# File 'lib/wralph/interfaces/objective_repository.rb', line 17

def self.reset_adapter
  @adapter = nil
end

.validate_adapter_interface(klass) ⇒ Object



71
72
73
74
75
76
77
78
# File 'lib/wralph/interfaces/objective_repository.rb', line 71

def self.validate_adapter_interface(klass)
  required_methods = i[download! local_file_path]
  missing_methods = required_methods.reject { |method| klass.respond_to?(method) }

  return if missing_methods.empty?

  raise "Custom adapter class must implement: #{missing_methods.join(', ')}"
end