Class: Inferno::Repositories::Repository Abstract

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/inferno/repositories/repository.rb

Overview

This class is abstract.

Base class for repositories. Subclass and override methods as needed.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.db ⇒ Object

Return the db connection for this repository.



13
14
15
# File 'lib/inferno/repositories/repository.rb', line 13

def self.db
  Application['db.connection'][table_name]
end

.table_name ⇒ String

Return the name of the database table for this repository. Override if the table name is not the snake case version of the name of the repository class.

Returns:

  • (String)


22
23
24
# File 'lib/inferno/repositories/repository.rb', line 22

def self.table_name
  name.demodulize.underscore.to_sym
end

Instance Method Details

#add_non_db_entities(hash) ⇒ Object



57
58
59
60
61
62
63
64
65
# File 'lib/inferno/repositories/repository.rb', line 57

def add_non_db_entities(hash)
  if hash.include? :test_id
    hash[:test] = Tests.new.find(hash[:test_id])
  elsif hash.include? :test_group_id
    hash[:test_group] = TestGroups.new.find(hash[:test_group_id])
  elsif hash.include? :test_suite_id
    hash[:test_suite] = TestSuites.new.find(hash[:test_suite_id])
  end
end

#build_entity(params) ⇒ Object

Creates an instance of the entity associated with this repository. Override if any special logic is required to create the entity.

Parameters:

  • params (Hash)

Returns:

  • (Object) —

    an instance of #entity_class



119
120
121
122
123
# File 'lib/inferno/repositories/repository.rb', line 119

def build_entity(params)
  add_non_db_entities(params)
  update_non_db_entities_ids(params)
  entity_class.new(params)
end

#create(params) ⇒ Inferno::Entities

Create a new record in the database.

Examples:

repo = Inferno::Repositories::SomeEntities.new
begin
  result = repo.create(key1: 'value1', key2: 'value2')
rescue Sequel::ValidationFailed => e
  # handle error
end

Parameters:

  • params (Hash)

Returns:



94
95
96
97
98
99
# File 'lib/inferno/repositories/repository.rb', line 94

def create(params)
  update_non_db_entities_ids(params, use_database_id: true)
  result = self.class::Model.create(db_params(params))

  build_entity(result.to_hash.merge(handle_non_db_params(params)))
end

#db_params(params) ⇒ Object



125
126
127
# File 'lib/inferno/repositories/repository.rb', line 125

def db_params(params)
  params.slice(*self.class::Model.columns)
end

#entity_class ⇒ Class

Return the class of the entity which will be instantiated by a repository. Override if the entity class is not in the Inferno::Entities namespace.

Returns:

  • (Class)


40
41
42
# File 'lib/inferno/repositories/repository.rb', line 40

def entity_class
  Entities.const_get(entity_class_name)
end

#entity_class_name ⇒ Class

Return the name of the entity class which will be instantiated by a repository. Override if the entity class name is not the singular version of the repository name.

Returns:

  • (Class)


31
32
33
# File 'lib/inferno/repositories/repository.rb', line 31

def entity_class_name
  self.class.name.demodulize.singularize
end

#find(id) ⇒ Inferno::Entities

Find a database record by id, and instantiate an entity from that record.

Parameters:

  • id (String)

Returns:



50
51
52
53
54
55
# File 'lib/inferno/repositories/repository.rb', line 50

def find(id)
  result = self.class::Model.find(id:)
  return result if result.nil?

  build_entity(result.to_hash)
end

#handle_non_db_params(params) ⇒ Object



133
134
135
# File 'lib/inferno/repositories/repository.rb', line 133

def handle_non_db_params(params)
  non_db_params(params)
end

#non_db_params(params) ⇒ Object



129
130
131
# File 'lib/inferno/repositories/repository.rb', line 129

def non_db_params(params)
  params.except(*self.class::Model.columns)
end

#update(entity_id, params = {}) ⇒ Object

Update a record in the database.

Examples:

repo = Inferno::Repositories::SomeEntities.new
result = repo.update(id, key1: 'value1', key2: 'value2')

Parameters:

  • entity_id (String)
  • params (Hash) (defaults to: {})


108
109
110
111
112
# File 'lib/inferno/repositories/repository.rb', line 108

def update(entity_id, params = {})
  self.class::Model
    .find(id: entity_id)
    .update(params.merge(updated_at: Time.now))
end

#update_non_db_entities_ids(hash, use_database_id: false) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/inferno/repositories/repository.rb', line 67

def update_non_db_entities_ids(hash, use_database_id: false)
  key_map = {
    test_id: Tests.new,
    test_group_id: TestGroups.new,
    test_suite_id: TestSuites.new
  }

  key_map.each do |key, repo|
    next unless hash.key?(key)

    entity = repo.find(hash[key])
    hash[key] = use_database_id ? (entity&.database_id || hash[key]) : (entity&.id || hash[key])
    break
  end
end