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

.dbObject

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_nameString

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



101
102
103
104
# File 'lib/inferno/repositories/repository.rb', line 101

def build_entity(params)
  add_non_db_entities(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:



78
79
80
81
# File 'lib/inferno/repositories/repository.rb', line 78

def create(params)
  result = self.class::Model.create(db_params(params))
  build_entity(result.to_hash.merge(handle_non_db_params(params)))
end

#db_params(params) ⇒ Object



106
107
108
# File 'lib/inferno/repositories/repository.rb', line 106

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

#entity_classClass

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_nameClass

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



114
115
116
# File 'lib/inferno/repositories/repository.rb', line 114

def handle_non_db_params(params)
  non_db_params(params)
end

#non_db_params(params) ⇒ Object



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

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: {})


90
91
92
93
94
# File 'lib/inferno/repositories/repository.rb', line 90

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