Class: Vedeu::Repositories::Repository

Inherits:
Object
  • Object
show all
Includes:
Common, Registerable, Store
Defined in:
lib/vedeu/repositories/repository.rb

Overview

Provides common methods for accessing the various repositories Vedeu uses.

Examples:

{ 'models' => [Model, Model, Model] }

{ 'models' => [Model] }

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Store

#each, #empty?, #exists?, #in_memory, #registered, #size

Methods included from Storage

#reset!

Methods included from Common

#absent?, #array?, #boolean, #boolean?, #empty_value?, #escape?, #falsy?, #hash?, #line_model?, #numeric?, #positionable?, #present?, #snake_case, #stream_model?, #string?, #symbol?, #truthy?, #view_model?

Methods included from Registerable

included

Constructor Details

#initialize(model = nil, storage = {}) ⇒ Vedeu::Repositories::Repository

Returns a new instance of Vedeu::Repositories::Repository.

Parameters:

  • model (Class) (defaults to: nil)
  • storage (Class|Hash) (defaults to: {})


34
35
36
37
# File 'lib/vedeu/repositories/repository.rb', line 34

def initialize(model = nil, storage = {})
  @model   = model
  @storage = storage
end

Instance Attribute Details

#modelvoid (readonly)

This method returns an undefined value.



23
24
25
# File 'lib/vedeu/repositories/repository.rb', line 23

def model
  @model
end

#storagevoid (readonly)

This method returns an undefined value.



27
28
29
# File 'lib/vedeu/repositories/repository.rb', line 27

def storage
  @storage
end

Instance Method Details

#allArray<void>

Return all the registered models.

Returns:

  • (Array<void>)

    An array containing each stored model.



49
50
51
52
53
# File 'lib/vedeu/repositories/repository.rb', line 49

def all
  return storage.values if hash?(storage)

  registered
end

#by_name(name = nil) ⇒ void

This method returns an undefined value.

Return the named model or a null object if not registered.

Examples:

# Fetch the cursor belonging to the interface of the same
# name.
Vedeu.cursors.by_name(:some_name)

# Fetch the names of the interfaces belonging to this group.
Vedeu.groups.by_name(name)

Parameters:

  • name (NilClass|Symbol|String) (defaults to: nil)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.



67
68
69
70
71
72
73
# File 'lib/vedeu/repositories/repository.rb', line 67

def by_name(name = nil)
  name = present?(name) ? name : Vedeu.focus

  return find(name) if registered?(name)

  null_model.new(null_attributes.merge(name: name)) if null_model?
end

#currentString|NilClass

Return the model for the interface currently in focus.

Returns:

  • (String|NilClass)


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

def current
  find_or_create(Vedeu.focus) if Vedeu.focus
end

#find(name) ⇒ Hash<String => Object>|NilClass

Find the model by name.

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.

Returns:

  • (Hash<String => Object>|NilClass)


86
87
88
# File 'lib/vedeu/repositories/repository.rb', line 86

def find(name)
  storage[name]
end

#find!(name) ⇒ Hash<String => Object>

Find the model attributes by name, raises an exception when the model cannot be found.

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.

Returns:

  • (Hash<String => Object>)

Raises:



97
98
99
100
# File 'lib/vedeu/repositories/repository.rb', line 97

def find!(name)
  find(name) || raise(Vedeu::Error::ModelNotFound,
                      "Cannot find model by name: '#{name}'")
end

#find_or_create(name) ⇒ void

This method returns an undefined value.

Find a model by name, registers the model by name when not found.

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.



107
108
109
110
111
112
113
114
115
# File 'lib/vedeu/repositories/repository.rb', line 107

def find_or_create(name)
  return find(name) if registered?(name)

  Vedeu.log(type:    :store,
            message: "Model (#{model}) not found, " \
                     "registering: '#{name}'")

  model.new(name).store
end

#inspectString

Returns:

  • (String)


118
119
120
# File 'lib/vedeu/repositories/repository.rb', line 118

def inspect
  "<#{self.class.name}>"
end

#log_store(model) ⇒ String (private)

Parameters:

  • model (void)

    A model instance.

Returns:

  • (String)


174
175
176
177
178
179
# File 'lib/vedeu/repositories/repository.rb', line 174

def log_store(model)
  type = registered?(model.name) ? :update : :create

  Vedeu.log(type:    type,
            message: "#{model.class.name}: '#{model.name}'")
end

#registered?(name) ⇒ Boolean

Returns a boolean indicating whether the named model is registered.

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.

Returns:



127
128
129
130
131
132
# File 'lib/vedeu/repositories/repository.rb', line 127

def registered?(name)
  return false if absent?(name)
  return false if empty?

  storage.include?(name)
end

#remove(name) ⇒ Hash|Boolean Also known as: delete

Returns the storage with the named model removed, or false when the model does not exist.

Parameters:

  • name (NilClass|Symbol|String)

    The name of the model or target model to act upon. May default to ‘Vedeu.focus`.

Returns:



139
140
141
142
143
144
145
# File 'lib/vedeu/repositories/repository.rb', line 139

def remove(name)
  return false if empty?
  return false unless registered?(name)

  storage.delete(name)
  storage unless storage.is_a?(Set)
end

#repositoryClass

Returns the repository class.

Returns:

  • (Class)


42
43
44
# File 'lib/vedeu/repositories/repository.rb', line 42

def repository
  self.class
end

#store(model, &block) ⇒ void Also known as: register, add

Note:

If a block is given, store the model, return the model after yielding.

This method returns an undefined value.

Stores the model instance by name in the repository of the model.

Parameters:

  • model (void)

    A model instance.

Raises:



156
157
158
159
160
161
162
163
164
165
166
# File 'lib/vedeu/repositories/repository.rb', line 156

def store(model, &block)
  valid_model?(model)

  log_store(model)

  storage[model.name] = model

  yield if block_given?

  model
end

#valid_model?(model) ⇒ Boolean (private)

Parameters:

  • model (void)

    A model instance.

Returns:

Raises:



184
185
186
187
188
# File 'lib/vedeu/repositories/repository.rb', line 184

def valid_model?(model)
  raise Vedeu::Error::MissingRequired,
        "Cannot store model '#{model.class}' without a name " \
        'attribute.' unless present?(model.name)
end