Class: Dsu::Models::Project

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Model, Support::Descriptable, Support::Fileable, Support::ProjectFileSystem
Defined in:
lib/dsu/models/project.rb

Overview

This class represents a project. A project is a collection of entry groups.

Constant Summary collapse

VERSION =
Migration::VERSION
MIN_PROJECT_NAME_LENGTH =
2
MAX_PROJECT_NAME_LENGTH =
32
MIN_DESCRIPTION_LENGTH =
2
MAX_DESCRIPTION_LENGTH =
64

Constants included from Support::Fileable

Support::Fileable::MIGRATION_VERSION_FILE_NAME

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Support::ProjectFileSystem

#exist?, included, #project_initialized?, #project_number

Methods included from Support::Fileable

#backup_folder_for, #config_file_name, #config_folder, #config_path, #current_project_file_name, #dsu_folder, #entries_file_name, #entries_folder, #entries_path, #gem_dir, #migration_version_folder, #migration_version_path, #project_file_for, #project_folder_for, #projects_folder, #root_folder, #seed_data_dsu_configuration_for, #seed_data_dsu_folder_for, #temp_folder, #theme_file_name, #themes_folder, #themes_path

Methods included from Support::Descriptable

included, #short_description

Constructor Details

#initialize(project_name:, description: nil, version: nil, options: {}) ⇒ Project

Returns a new instance of Project.

Raises:

  • (ArgumentError)


38
39
40
41
42
43
44
45
46
# File 'lib/dsu/models/project.rb', line 38

def initialize(project_name:, description: nil, version: nil, options: {})
  raise ArgumentError, 'project_name is blank' if project_name.blank?
  raise ArgumentError, 'version is the wrong object type' unless version.is_a?(Integer) || version.nil?

  self.project_name = project_name
  self.description = description
  self.version = version || VERSION
  self.options = options || {}
end

Instance Attribute Details

#current_project_fileObject

Returns the value of attribute current_project_file.



32
33
34
# File 'lib/dsu/models/project.rb', line 32

def current_project_file
  @current_project_file
end

#descriptionObject

Returns the value of attribute description.



32
33
34
# File 'lib/dsu/models/project.rb', line 32

def description
  @description
end

#optionsObject

Returns the value of attribute options.



32
33
34
# File 'lib/dsu/models/project.rb', line 32

def options
  @options
end

#project_nameObject

Returns the value of attribute project_name.



32
33
34
# File 'lib/dsu/models/project.rb', line 32

def project_name
  @project_name
end

#versionObject

Returns the value of attribute version.



32
33
34
# File 'lib/dsu/models/project.rb', line 32

def version
  @version
end

Class Method Details

.allObject



135
136
137
138
139
# File 'lib/dsu/models/project.rb', line 135

def all
  .map do ||
    find(project_name: [:project_name])
  end
end

.can_delete?(project_name:) ⇒ Boolean



141
142
143
144
145
146
147
148
149
150
# File 'lib/dsu/models/project.rb', line 141

def can_delete?(project_name:)
  exist?(project_name: project_name) &&
    # Cannot delete the last project.
    count > 1 &&
    # Do not allow the project to be deleted if it
    # is currently the default project.
    # The user needs to change to another default
    # project before they can delete this project.
    !default_project?(project_name: project_name)
end

.countObject



152
153
154
# File 'lib/dsu/models/project.rb', line 152

def count
  .count
end

.create(project_name:, description: nil, options: {}) ⇒ Object Also known as: update



156
157
158
159
160
161
162
163
# File 'lib/dsu/models/project.rb', line 156

def create(project_name:, description: nil, options: {})
  Models::Project.new(project_name: project_name, description: description, options: options).tap do |project|
    project.validate!
    initialize_project(project_name: project_name)
    Crud::JsonFile.write!(file_data: project.to_h,
      file_path: project_file_for(project_name: project_name))
  end
end

.create!(project_name:, description: nil, options: {}) ⇒ Object Also known as: update!



166
167
168
169
170
171
172
# File 'lib/dsu/models/project.rb', line 166

def create!(project_name:, description: nil, options: {})
  if exist?(project_name: project_name)
    raise I18n.t('models.project.errors.already_exists', project_name: project_name)
  end

  create(project_name: project_name, description: description, options: options)
end

.current_projectObject



175
176
177
# File 'lib/dsu/models/project.rb', line 175

def current_project
  find(project_name: current_project_name)
end

.current_project?(project_name:) ⇒ Boolean



179
180
181
# File 'lib/dsu/models/project.rb', line 179

def current_project?(project_name:)
  current_project_name == project_name
end

.default!(project:) ⇒ Object



183
184
185
186
187
188
189
190
# File 'lib/dsu/models/project.rb', line 183

def default!(project:)
  project.validate!

  Models::Configuration.new.tap do |configuration|
    configuration.default_project = project.project_name
    configuration.save!
  end
end

.default_projectObject



192
193
194
# File 'lib/dsu/models/project.rb', line 192

def default_project
  find(project_name: default_project_name)
end

.default_project?(project_name:) ⇒ Boolean



196
197
198
# File 'lib/dsu/models/project.rb', line 196

def default_project?(project_name:)
  project_name == default_project_name
end

.delete(project_name:) ⇒ Object



200
201
202
203
204
205
206
207
# File 'lib/dsu/models/project.rb', line 200

def delete(project_name:)
  return false unless can_delete?(project_name: project_name)

  project_folder = project_folder_for(project_name: project_name)
  FileUtils.rm_rf(project_folder)

  true
end

.delete!(project_name:) ⇒ Object



209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/dsu/models/project.rb', line 209

def delete!(project_name:)
  unless exist?(project_name: project_name)
    raise I18n.t('models.project.errors.does_not_exist', project_name: project_name)
  end

  raise I18n.t('models.project.errors.delete_only_project', project_name: project_name) unless count > 1

  if default_project?(project_name: project_name)
    raise I18n.t('models.project.errors.delete_default_project', project_name: project_name)
  end

  delete(project_name: project_name)
end

.find(project_name:) ⇒ Object



223
224
225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/dsu/models/project.rb', line 223

def find(project_name:)
  unless project_folder_exist?(project_name: project_name)
    raise I18n.t('models.project.errors.does_not_exist', project_name: project_name)
  end

  project_file = project_file_for(project_name: project_name)

  unless project_file_exist?(project_name: project_name)
    raise I18n.t('models.project.errors.project_file_not_exist', project_file: project_file)
  end

  project_hash = Crud::JsonFile.read!(file_path: project_file)
  Services::Project::HydratorService.new(project_hash: project_hash).call
end

.find_by_number(project_number:) ⇒ Object

project_number is 1 based.



239
240
241
242
243
244
245
246
# File 'lib/dsu/models/project.rb', line 239

def find_by_number(project_number:)
  project = .find do ||
    [:project_number] == project_number.to_i
  end
  return unless project

  find(project_name: project[:project_name])
end

.find_or_initialize(project_name:) ⇒ Object

def find_or_create(project_name:)

find_or_initialize(project_name: project_name).tap do |project|
  project.save! unless project.persisted?
end

end



254
255
256
257
258
259
260
# File 'lib/dsu/models/project.rb', line 254

def find_or_initialize(project_name:)
  return Models::Project.new(project_name: project_name) unless project_file_exist?(project_name: project_name)

  project_file = project_file_for(project_name: project_name)
  project_hash = Crud::JsonFile.read!(file_path: project_file)
  Services::Project::HydratorService.new(project_hash: project_hash).call
end

.rename!(project_name:, new_project_name:, new_project_description: nil, options: {}) ⇒ Object



262
263
264
265
# File 'lib/dsu/models/project.rb', line 262

def rename!(project_name:, new_project_name:, new_project_description: nil, options: {})
  Services::Project::RenameService.new(from_project_name: project_name,
    to_project_name: new_project_name, to_project_description: new_project_description, options: options).call
end

.use!(project:) ⇒ Object



267
268
269
270
271
272
# File 'lib/dsu/models/project.rb', line 267

def use!(project:)
  project.validate!

  current_project_hash = { version: project.version, project_name: project.project_name }
  Crud::JsonFile.write!(file_data: current_project_hash, file_path: current_project_file)
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?

Override == and hash so that we can compare Entry Group objects.



49
50
51
52
53
54
# File 'lib/dsu/models/project.rb', line 49

def ==(other)
  other.is_a?(Project) &&
    project_name == other.project_name &&
    description == other.description &&
    version == other.version
end

#can_delete?Boolean



57
58
59
# File 'lib/dsu/models/project.rb', line 57

def can_delete?
  self.class.can_delete?(project_name: project_name)
end

#createObject



61
62
63
# File 'lib/dsu/models/project.rb', line 61

def create
  self.class.create(project_name: project_name, description: description)
end

#create!Object



66
67
68
# File 'lib/dsu/models/project.rb', line 66

def create!
  self.class.create!(project_name: project_name, description: description)
end

#current_project?Boolean



71
72
73
# File 'lib/dsu/models/project.rb', line 71

def current_project?
  self.class.current_project?(project_name: project_name)
end

#default!Object



75
76
77
78
79
# File 'lib/dsu/models/project.rb', line 75

def default!
  return if default_project?

  self.class.default!(project: self)
end

#default_project?Boolean



81
82
83
# File 'lib/dsu/models/project.rb', line 81

def default_project?
  self.class.default_project?(project_name: project_name)
end

#deleteObject



85
86
87
# File 'lib/dsu/models/project.rb', line 85

def delete
  self.class.delete(project_name: project_name)
end

#delete!Object



89
90
91
# File 'lib/dsu/models/project.rb', line 89

def delete!
  self.class.delete!(project_name: project_name)
end

#hashObject



93
94
95
# File 'lib/dsu/models/project.rb', line 93

def hash
  [project_name, description, version].map(&:hash).hash
end

#project_fileObject



97
98
99
# File 'lib/dsu/models/project.rb', line 97

def project_file
  self.class.project_file(project_name: project_name)
end

#project_folderObject



101
102
103
# File 'lib/dsu/models/project.rb', line 101

def project_folder
  self.class.project_folder(project_name: project_name)
end

#rename!(new_project_name:, new_project_description: nil) ⇒ Object



105
106
107
108
# File 'lib/dsu/models/project.rb', line 105

def rename!(new_project_name:, new_project_description: nil)
  self.class.rename!(project_name: project_name,
    new_project_name: new_project_name, new_project_description: new_project_description, options: options)
end

#saveObject



64
65
66
# File 'lib/dsu/models/project.rb', line 64

def create
  self.class.create(project_name: project_name, description: description)
end

#save!Object



69
70
71
# File 'lib/dsu/models/project.rb', line 69

def create!
  self.class.create!(project_name: project_name, description: description)
end

#to_hObject



110
111
112
113
114
115
116
# File 'lib/dsu/models/project.rb', line 110

def to_h
  {
    version: version,
    project_name: project_name,
    description: description
  }
end

#use!Object

def update!

self.class.update!(project_name: project_name, description: description, version: version, options: options)

end



126
127
128
129
130
# File 'lib/dsu/models/project.rb', line 126

def use!
  return if current_project?

  self.class.use!(project: self)
end