Class: Dsu::Models::Project
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
Support::Fileable::MIGRATION_VERSION_FILE_NAME
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
#exist?, included, #project_initialized?, #project_number
#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
included, #short_description
Constructor Details
#initialize(project_name:, description: nil, version: nil, options: {}) ⇒ Project
Returns a new instance of Project.
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_file ⇒ Object
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
|
#description ⇒ Object
Returns the value of attribute description.
32
33
34
|
# File 'lib/dsu/models/project.rb', line 32
def description
@description
end
|
#options ⇒ Object
Returns the value of attribute options.
32
33
34
|
# File 'lib/dsu/models/project.rb', line 32
def options
@options
end
|
#project_name ⇒ Object
Returns the value of attribute project_name.
32
33
34
|
# File 'lib/dsu/models/project.rb', line 32
def project_name
@project_name
end
|
#version ⇒ Object
Returns the value of attribute version.
32
33
34
|
# File 'lib/dsu/models/project.rb', line 32
def version
@version
end
|
Class Method Details
.all ⇒ Object
135
136
137
138
139
|
# File 'lib/dsu/models/project.rb', line 135
def all
project_metadata.map do |metadata|
find(project_name: metadata[: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) &&
count > 1 &&
!default_project?(project_name: project_name)
end
|
.count ⇒ Object
152
153
154
|
# File 'lib/dsu/models/project.rb', line 152
def count
project_metadata.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_project ⇒ Object
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_project ⇒ Object
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 = project_metadata.find do |metadata|
metadata[: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
|
#create ⇒ Object
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
|
#delete ⇒ Object
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
|
#hash ⇒ Object
93
94
95
|
# File 'lib/dsu/models/project.rb', line 93
def hash
[project_name, description, version].map(&:hash).hash
end
|
#project_file ⇒ Object
97
98
99
|
# File 'lib/dsu/models/project.rb', line 97
def project_file
self.class.project_file(project_name: project_name)
end
|
#project_folder ⇒ Object
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
|
#save ⇒ Object
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_h ⇒ Object
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
|