shnaider_code 1.1.6 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/shnaider_code/version.rb +2 -2
  3. data/lib/shnaider_code.rb +1 -1
  4. data/lib/source/attr_limited_regex_accessor.rb +43 -0
  5. data/lib/source/controllers/create_student_controller.rb +8 -0
  6. data/lib/source/controllers/edit_student_controller.rb +10 -0
  7. data/lib/source/controllers/view_controller.rb +106 -0
  8. data/lib/source/data_construct_pattern/data_construct_pattarn.rb +25 -0
  9. data/lib/source/data_list.rb +59 -0
  10. data/lib/source/data_list_student_short.rb +28 -0
  11. data/lib/source/data_table.rb +21 -0
  12. data/lib/source/database/scripts/create_table.sql +10 -0
  13. data/lib/source/database/scripts/fill_data.sql +14 -0
  14. data/lib/source/database/students_db.rb +78 -0
  15. data/lib/source/database/students_list_db.rb +36 -0
  16. data/lib/source/student/abstract_student.rb +26 -0
  17. data/lib/source/student/student.rb +120 -0
  18. data/lib/source/student/student_short.rb +59 -0
  19. data/lib/source/student_list_format.rb +50 -0
  20. data/lib/source/students_list.rb +43 -0
  21. data/lib/source/students_list_adapter.rb +89 -0
  22. data/lib/source/students_list_format_strategy.rb +59 -0
  23. data/shnaider_code-2.0.0.gem +0 -0
  24. data/shnaider_code.gemspec +1 -1
  25. metadata +21 -25
  26. data/Gemfile +0 -13
  27. data/lib/source/controllers/student_input_form/student_input_form_controller_create.rb +0 -59
  28. data/lib/source/controllers/student_input_form/student_input_form_controller_edit.rb +0 -68
  29. data/lib/source/controllers/tab_students_controller.rb +0 -82
  30. data/lib/source/db_config/config.yaml +0 -5
  31. data/lib/source/db_config/migrations/001_create_table_student.sql +0 -12
  32. data/lib/source/db_config/mock_data/fill_student.sql +0 -6
  33. data/lib/source/models/student.rb +0 -103
  34. data/lib/source/models/student_base.rb +0 -100
  35. data/lib/source/models/student_short.rb +0 -50
  36. data/lib/source/repositories/adapters/db_source_adapter.rb +0 -54
  37. data/lib/source/repositories/adapters/file_source_adapter.rb +0 -37
  38. data/lib/source/repositories/containers/data_list.rb +0 -74
  39. data/lib/source/repositories/containers/data_list_student_short.rb +0 -18
  40. data/lib/source/repositories/containers/data_table.rb +0 -35
  41. data/lib/source/repositories/data_sources/db_data_source.rb +0 -37
  42. data/lib/source/repositories/data_sources/file_data_source.rb +0 -75
  43. data/lib/source/repositories/data_sources/transformers/data_transformer_base.rb +0 -15
  44. data/lib/source/repositories/data_sources/transformers/data_transformer_json.rb +0 -16
  45. data/lib/source/repositories/data_sources/transformers/data_transformer_yaml.rb +0 -16
  46. data/lib/source/repositories/student_repository.rb +0 -32
  47. data/lib/source/util/logger_holder.rb +0 -24
  48. data/shnaider_code-1.1.4.gem +0 -0
  49. data/sig/shnaider_code.rbs +0 -4
@@ -0,0 +1,50 @@
1
+ module McDelta
2
+ class StudentListFormat
3
+ attr_private_accessor :students
4
+ attr_accessor :formater
5
+
6
+ def initialize(formater)
7
+ self.formater = formater
8
+ end
9
+
10
+ def read_from(filename)
11
+ self.students = formater.read_from(filename)
12
+ end
13
+
14
+ def write_to(filename)
15
+ formater.write_to(filename, self.students)
16
+ end
17
+
18
+ def get_student(id)
19
+ self.students.detect { |x|
20
+ x.id == id .to_s
21
+ }
22
+ end
23
+
24
+ def add_student(student)
25
+ self.students << student
26
+ end
27
+
28
+ def delete_student(id)
29
+ index = students.index(students.detect { |x| x.id == id.to_s })
30
+ self.students.delete_at(index)
31
+ end
32
+
33
+ def replace_student(id, student)
34
+ self.students.map! { |x| x.id == id.to_s ? student : x }
35
+ end
36
+
37
+ def get_students_slice(k, count)
38
+ from = [k * count, self.students.count].min
39
+ to = [self.students.count, from + count].min
40
+ end
41
+
42
+ def count()
43
+ self.students.count
44
+ end
45
+
46
+ def sort()
47
+ self.students.sort_by(&:fio_info)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,43 @@
1
+ require "source/attr_limited_regex_accessor.rb"
2
+
3
+ module McDelta
4
+ class StudentsList
5
+ attr_private_accessor :students_list_adapter
6
+
7
+ def initialize(adapter)
8
+ self.students_list_adapter = adapter
9
+ end
10
+
11
+ def get_student(id)
12
+ students_list_adapter.get_student(id)
13
+ end
14
+
15
+ def remove_student(id)
16
+ students_list_adapter.remove_student(id)
17
+ end
18
+
19
+ def replace_student(id, student)
20
+ students_list_adapter.replace_student(id, student)
21
+ end
22
+
23
+ def get_students(from, to, data)
24
+ values = students_list_adapter.get_students(from, to)
25
+
26
+ if data == nil
27
+ data = DataList.new(list: values)
28
+ else
29
+ data.list = values
30
+ end
31
+
32
+ data.list
33
+ end
34
+
35
+ def add_student(student)
36
+ students_list_adapter.add_student(student)
37
+ end
38
+
39
+ def count
40
+ students_list_adapter.count()
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,89 @@
1
+ module McDelta
2
+ class StudentsListAdapter
3
+ def get_student(id)
4
+ end
5
+
6
+ def remove_student(id)
7
+ end
8
+
9
+ def replace_student(id, student, data)
10
+ end
11
+
12
+ def get_students(from, to, data)
13
+ end
14
+
15
+ def add_student(student)
16
+ end
17
+
18
+ def count
19
+ end
20
+ end
21
+
22
+ class StudentsListDBAdapter < StudentsListAdapter
23
+ attr_private_accessor :database_list
24
+
25
+ def initialize(database_list)
26
+ self.database_list = database_list
27
+ end
28
+
29
+ def get_student(id)
30
+ database_list.get_student(id)
31
+ end
32
+
33
+ def remove_student(id)
34
+ database_list.remove_student(id)
35
+ end
36
+
37
+ def replace_student(id, student)
38
+ database_list.replace_student(id, student)
39
+ end
40
+
41
+ def get_students(from, to)
42
+ database_list.get_students_slice(from, to)
43
+ end
44
+
45
+ def add_student(student)
46
+ database_list.add_student(student)
47
+ end
48
+
49
+ def count
50
+ database_list.count()
51
+ end
52
+ end
53
+
54
+ class StudentsListFormatterAdapter < StudentsListAdapter
55
+ attr_private_accessor :formatter
56
+
57
+ def initialize(formatter, filename)
58
+ self.formatter = formatter
59
+ formatter.read_from(filename)
60
+ end
61
+
62
+ def get_student(id)
63
+ formatter.get_student(id)
64
+ end
65
+
66
+ def remove_student(id)
67
+ formatter.delete_student(id)
68
+ end
69
+
70
+ def replace_student(id, student)
71
+ formatter.replace_student(id, student)
72
+ end
73
+
74
+ def get_students(from, to)
75
+ count = to - from
76
+ k = from / count
77
+
78
+ formatter.get_students_slice(k, count)
79
+ end
80
+
81
+ def add_student(student)
82
+ formatter.add_student(student)
83
+ end
84
+
85
+ def count
86
+ formatter.count()
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,59 @@
1
+ require 'json'
2
+ require 'yaml'
3
+
4
+ module McDelta
5
+ class StudentsListFormatStrategy
6
+ def read_from(filename)
7
+ require 'method not implemented'
8
+ end
9
+
10
+ def write_to(filename, students)
11
+ require 'method not implemented'
12
+ end
13
+ end
14
+
15
+ class TxtStudentsListFormatStrategy < StudentsListFormatStrategy
16
+ def read_from(filename)
17
+ File.read(filename)
18
+ .split("\n")
19
+ .map { |v| Student.from_string(v) }
20
+ end
21
+
22
+ def write_to(filename, students)
23
+ File.open(filename, 'w') { |file|
24
+ file.write(
25
+ students.map { |student|
26
+ student.get_info
27
+ }
28
+ .join("\n")
29
+ )
30
+ }
31
+ end
32
+ end
33
+
34
+ class JsonStudentsListFormatStrategy < StudentsListFormatStrategy
35
+ def read_from(filename)
36
+ file = File.read(filename)
37
+ json = JSON.parse(file)
38
+ json.map { |x| Student.from_json(x) }
39
+ end
40
+
41
+ def write_to(filename, students)
42
+ File.open(filename, 'w') do |f|
43
+ f.write(JSON.generate(students.map { |x| x.as_json }))
44
+ end
45
+ end
46
+ end
47
+
48
+ class YamlStudentsListFormatStrategy < StudentsListFormatStrategy
49
+ def read_from(filename)
50
+ YAML.load_file(filename)
51
+ end
52
+
53
+ def write_to(filename, students)
54
+ File.open(filename, 'w') do |file|
55
+ file.write(students.to_yaml)
56
+ end
57
+ end
58
+ end
59
+ end
Binary file
@@ -2,7 +2,7 @@ require_relative "lib/shnaider_code/version"
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "shnaider_code"
5
- spec.version = Shnaider::VERSION
5
+ spec.version = ShnaiderCode::VERSION
6
6
  spec.authors = ["Iya"]
7
7
  spec.email = ["iya@gmail.com"]
8
8
  spec.summary = "Student App"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shnaider_code
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.6
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iya
@@ -31,33 +31,29 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
- - Gemfile
35
34
  - lib/shnaider_code.rb
36
35
  - lib/shnaider_code/version.rb
37
- - lib/source/controllers/student_input_form/student_input_form_controller_create.rb
38
- - lib/source/controllers/student_input_form/student_input_form_controller_edit.rb
39
- - lib/source/controllers/tab_students_controller.rb
40
- - lib/source/db_config/config.yaml
41
- - lib/source/db_config/migrations/001_create_table_student.sql
42
- - lib/source/db_config/mock_data/fill_student.sql
43
- - lib/source/models/student.rb
44
- - lib/source/models/student_base.rb
45
- - lib/source/models/student_short.rb
46
- - lib/source/repositories/adapters/db_source_adapter.rb
47
- - lib/source/repositories/adapters/file_source_adapter.rb
48
- - lib/source/repositories/containers/data_list.rb
49
- - lib/source/repositories/containers/data_list_student_short.rb
50
- - lib/source/repositories/containers/data_table.rb
51
- - lib/source/repositories/data_sources/db_data_source.rb
52
- - lib/source/repositories/data_sources/file_data_source.rb
53
- - lib/source/repositories/data_sources/transformers/data_transformer_base.rb
54
- - lib/source/repositories/data_sources/transformers/data_transformer_json.rb
55
- - lib/source/repositories/data_sources/transformers/data_transformer_yaml.rb
56
- - lib/source/repositories/student_repository.rb
57
- - lib/source/util/logger_holder.rb
58
- - shnaider_code-1.1.4.gem
36
+ - lib/source/attr_limited_regex_accessor.rb
37
+ - lib/source/controllers/create_student_controller.rb
38
+ - lib/source/controllers/edit_student_controller.rb
39
+ - lib/source/controllers/view_controller.rb
40
+ - lib/source/data_construct_pattern/data_construct_pattarn.rb
41
+ - lib/source/data_list.rb
42
+ - lib/source/data_list_student_short.rb
43
+ - lib/source/data_table.rb
44
+ - lib/source/database/scripts/create_table.sql
45
+ - lib/source/database/scripts/fill_data.sql
46
+ - lib/source/database/students_db.rb
47
+ - lib/source/database/students_list_db.rb
48
+ - lib/source/student/abstract_student.rb
49
+ - lib/source/student/student.rb
50
+ - lib/source/student/student_short.rb
51
+ - lib/source/student_list_format.rb
52
+ - lib/source/students_list.rb
53
+ - lib/source/students_list_adapter.rb
54
+ - lib/source/students_list_format_strategy.rb
55
+ - shnaider_code-2.0.0.gem
59
56
  - shnaider_code.gemspec
60
- - sig/shnaider_code.rbs
61
57
  homepage: https://github.com/bushmrz/learning-patterns-with-ruby
62
58
  licenses:
63
59
  - MIT
data/Gemfile DELETED
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "mysql2"
6
- gem "glimmer-dsl-libui",'~> 0.7.4'
7
- gem 'win32api'
8
- gem "minitest"
9
- gem 'rubocop', group: 'development'
10
- gem 'shnaider_code'
11
- gem 'sinatra', '~> 3.0', '>= 3.0.6'
12
- gem 'thin', '~> 1.8', '>= 1.8.2'
13
-
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'source/util/logger_holder'
3
- require 'win32api'
4
-
5
- class StudentInputFormControllerCreate
6
- def initialize(parent_controller)
7
- @parent_controller = parent_controller
8
- LoggerHolder.instance.debug('StudentInputFormControllerCreate: initialized')
9
- end
10
-
11
- def set_view(view)
12
- @view = view
13
- LoggerHolder.instance.debug('StudentInputFormControllerCreate: view set')
14
- end
15
-
16
- def refresh
17
- @parent_controller.refresh_data(1, 20)
18
- end
19
-
20
- def on_view_created
21
- begin
22
- @student_rep = StudentRepository.new(DBSourceAdapter.new)
23
- rescue Mysql2::Error::ConnectionError => e
24
- on_db_conn_error(e)
25
- end
26
- end
27
-
28
- def process_fields(fields)
29
- begin
30
- last_name = fields.delete(:last_name)
31
- first_name = fields.delete(:first_name)
32
- father_name = fields.delete(:father_name)
33
-
34
- return if last_name.nil? || first_name.nil? || father_name.nil?
35
-
36
- student = Student.new(last_name, first_name, father_name, **fields)
37
-
38
- @student_rep.add_student(student)
39
-
40
- LoggerHolder.instance.debug('StudentInputFormControllerCreate: adding student to DB')
41
-
42
- @view.close
43
- rescue ArgumentError => e
44
- LoggerHolder.instance.debug("StudentInputFormControllerCreate: wrong fields: #{e.message}")
45
- api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
46
- api.call(0, e.message, 'Error', 0)
47
- end
48
- end
49
-
50
- private
51
-
52
- def on_db_conn_error(error)
53
- LoggerHolder.instance.debug('StudentInputFormControllerCreate: DB connection error:')
54
- LoggerHolder.instance.error(error.message)
55
- api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
56
- api.call(0, "No connection to DB", "Error", 0)
57
- @view.close
58
- end
59
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'source/util/logger_holder'
4
- require 'win32api'
5
-
6
- class StudentInputFormControllerEdit
7
- def initialize(parent_controller, existing_student_id)
8
- @parent_controller = parent_controller
9
- @existing_student_id = existing_student_id
10
- LoggerHolder.instance.debug('StudentInputFormControllerEdit: initialized')
11
- end
12
-
13
- def set_view(view)
14
- @view = view
15
- LoggerHolder.instance.debug('StudentInputFormControllerEdit: view set')
16
- end
17
-
18
- def refresh
19
- @parent_controller.refresh_data(1, 20)
20
- end
21
-
22
- def on_view_created
23
- begin
24
- @student_rep = StudentRepository.new(DBSourceAdapter.new)
25
- rescue Mysql2::Error::ConnectionError => e
26
- on_db_conn_error(e)
27
- end
28
- @existing_student = @student_rep.student_by_id(@existing_student_id)
29
- #@view.make_readonly(:git, :telegram, :email, :phone)
30
- populate_fields(@existing_student)
31
- end
32
-
33
- def populate_fields(student)
34
- @view.set_value(:last_name, student.last_name)
35
- @view.set_value(:first_name, student.first_name)
36
- @view.set_value(:father_name, student.father_name)
37
- @view.set_value(:git, student.git)
38
- @view.set_value(:telegram, student.telegram)
39
- @view.set_value(:email, student.email)
40
- @view.set_value(:phone, student.phone)
41
- end
42
-
43
- def process_fields(fields)
44
- begin
45
- new_student = Student.from_hash(fields)
46
-
47
- LoggerHolder.instance.debug('StudentInputFormControllerEdit: replacing student in DB')
48
-
49
- @student_rep.replace_student(@existing_student_id, new_student)
50
-
51
- @view.close
52
- rescue ArgumentError => e
53
- LoggerHolder.instance.debug("StudentInputFormControllerEdit: wrong fields: #{e.message}")
54
- api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
55
- api.call(0, e.message, 'Error', 0)
56
- end
57
- end
58
-
59
- private
60
-
61
- def on_db_conn_error(error)
62
- LoggerHolder.instance.debug('StudentInputFormControllerEdit: DB connection error:')
63
- LoggerHolder.instance.error(error.message)
64
- api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
65
- api.call(0, "No connection to DB", "Error", 0)
66
- @view.close
67
- end
68
- end
@@ -1,82 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require './LabStudents/views/main_window'
4
- require 'source/repositories/student_repository'
5
- require 'source/repositories/adapters/db_source_adapter'
6
- require 'source/repositories/containers/data_list_student_short'
7
- require './LabStudents/views/student_input_form'
8
- require 'source/controllers/student_input_form/student_input_form_controller_create'
9
- require 'source/controllers/student_input_form/student_input_form_controller_edit'
10
- require 'source/util/logger_holder'
11
- require 'win32api'
12
-
13
- class TabStudentsController
14
- def initialize(view)
15
- LoggerHolder.instance.debug('TabStudentsController: init start')
16
- @view = view
17
- @data_list = DataListStudentShort.new([])
18
- @data_list.add_listener(@view)
19
- LoggerHolder.instance.debug('TabStudentsController: init done')
20
- end
21
-
22
- def on_view_created
23
- begin
24
- @student_rep = StudentRepository.new(DBSourceAdapter.new)
25
- LoggerHolder.instance.debug('TabStudentsController: created student repository')
26
- rescue Mysql2::Error::ConnectionError => e
27
- on_db_conn_error(e)
28
- end
29
- end
30
-
31
- def show_modal_add
32
- LoggerHolder.instance.debug('TabStudentsController: showing modal (add)')
33
- controller = StudentInputFormControllerCreate.new(self)
34
- view = StudentInputForm.new(controller)
35
- controller.set_view(view)
36
- view.create.show
37
- end
38
-
39
- def show_modal_edit(current_page, per_page, selected_row)
40
- LoggerHolder.instance.debug('TabStudentsController: showing modal (edit)')
41
- student_num = (current_page - 1) * per_page + selected_row
42
- @data_list.select_element(student_num)
43
- student_id = @data_list.selected_id
44
- controller = StudentInputFormControllerEdit.new(self, student_id)
45
- view = StudentInputForm.new(controller)
46
- controller.set_view(view)
47
- view.create.show
48
- end
49
-
50
- def delete_selected(current_page, per_page, selected_row)
51
- begin
52
- LoggerHolder.instance.debug('TabStudentsController: deleting selected student')
53
- student_num = (current_page - 1) * per_page + selected_row
54
- @data_list.select_element(student_num)
55
- student_id = @data_list.selected_id
56
- @student_rep.remove_student(student_id)
57
- rescue Mysql2::Error::ConnectionError => e
58
- on_db_conn_error(e)
59
- end
60
- end
61
-
62
- def refresh_data(page, per_page)
63
- begin
64
- LoggerHolder.instance.debug('TabStudentsController: refreshing data...')
65
- @data_list = @student_rep.paginated_short_students(page, per_page, @data_list)
66
- @view.update_student_count(@student_rep.student_count)
67
- rescue Mysql2::Error::ConnectionError => e
68
- on_db_conn_error(e)
69
- end
70
- end
71
-
72
- private
73
-
74
- def on_db_conn_error(error)
75
- LoggerHolder.instance.error('TabStudentsController: DB connection error:')
76
- LoggerHolder.instance.error(error.message)
77
- api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
78
- api.call(0, "No connection to DB", "Error", 0)
79
- # TODO: Возможность переключения на JSON помимо exit
80
- exit(false)
81
- end
82
- end
@@ -1,5 +0,0 @@
1
- host: 'localhost'
2
- port: 3306
3
- username: 'root'
4
- password: 'root'
5
- database: 'university'
@@ -1,12 +0,0 @@
1
- create table student (
2
- id int auto_increment,
3
- last_name varchar(128) not null,
4
- first_name varchar(128) not null,
5
- father_name varchar(128) not null,
6
- phone varchar(20) null,
7
- telegram varchar(100) null,
8
- email varchar(100) null,
9
- git varchar(100) null,
10
- constraint student_pk
11
- primary key (id)
12
- );
@@ -1,6 +0,0 @@
1
- insert into student(last_name, first_name, father_name, phone, telegram, email, git) values
2
- ("Шнайдер", "Ия", "Ниевна", NULL, NULL, NULL, "bushmrz"),
3
- ("Худокмырлов", "Дмитрий", "Александрович", "78005553535", NULL, NULL, "kittenqz"),
4
- ("Шнайдер", "Ий", " Ниевич", NULL, NULL, NULL, "invisible"),
5
- ("Сайксова", "Риночка", "Рири", NULL, "slowrunner3000", NULL, NULL),
6
- ("Кузнецов", "Максим", "Александрович", "+7-900-900-90-90", "maxonhol", "maximilian@ya.ru", "maxonspb");
@@ -1,103 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'json'
4
- require_relative 'student_base'
5
-
6
- class Student < StudentBase
7
- # Делаем new предка публичным
8
- public_class_method :new
9
-
10
- def self.from_hash(hash)
11
- hash = hash.dup
12
- raise ArgumentError, 'Fields required: fist_name, last_name, father_name' unless hash.key?(:first_name) && hash.key?(:last_name) && hash.key?(:father_name)
13
-
14
- first_name = hash.delete(:first_name)
15
- last_name = hash.delete(:last_name)
16
- father_name = hash.delete(:father_name)
17
-
18
- Student.new(last_name, first_name, father_name, **hash)
19
- end
20
-
21
- # Конструктор из JSON строки
22
- def self.from_json_str(str)
23
- params = JSON.parse(str, { symbolize_names: true })
24
- from_hash(params)
25
- end
26
-
27
- # Делаем публичными геттеры и сеттеры базового класса
28
- public :phone, :telegram, :email, 'id=', 'phone=', 'telegram=', 'email=', 'git='
29
-
30
- # Стандартные геттеры для полей
31
- attr_reader :last_name, :first_name, :father_name
32
-
33
- # Стандартный конструктор
34
- def initialize(last_name, first_name, father_name, **options)
35
- self.last_name = last_name
36
- self.first_name = first_name
37
- self.father_name = father_name
38
- super(**options)
39
- end
40
-
41
- # Сеттеры с валидацией перед присваиванием
42
- def last_name=(new_last_name)
43
- raise ArgumentError, "Invalid argument: last_name=#{new_last_name}" unless Student.valid_name?(new_last_name)
44
-
45
- @last_name = new_last_name
46
- end
47
-
48
- def first_name=(new_first_name)
49
- raise ArgumentError, "Invalid argument: first_name=#{new_first_name}" unless Student.valid_name?(new_first_name)
50
-
51
- @first_name = new_first_name
52
- end
53
-
54
- def father_name=(new_father_name)
55
- raise ArgumentError, "Invalid argument: father_name=#{new_father_name}" unless Student.valid_name?(new_father_name)
56
-
57
- @father_name = new_father_name
58
- end
59
-
60
- # Отдельный сеттер для массовой установки контактов
61
- def set_contacts(phone: nil, telegram: nil, email: nil)
62
- self.phone = phone if phone
63
- self.telegram = telegram if telegram
64
- self.email = email if email
65
- end
66
-
67
- # Имя пользователя в формате Фамилия И. О.
68
- def last_name_and_initials
69
- "#{last_name} #{first_name[0]}. #{father_name[0]}."
70
- end
71
-
72
- # Краткая информация о пользователе
73
- def short_info
74
- info = {}
75
- info[:last_name_and_initials] = last_name_and_initials
76
- info[:contact] = short_contact
77
- info[:git] = git
78
- JSON.generate(info)
79
- end
80
-
81
- # Методы приведения объекта к строке
82
- def to_s
83
- result = "#{last_name} #{first_name} #{father_name}"
84
- %i[id phone telegram email git].each do |attr|
85
- attr_val = send(attr)
86
- result += ", #{attr}=#{attr_val}" unless attr_val.nil?
87
- end
88
- result
89
- end
90
-
91
- def to_hash
92
- attrs = {}
93
- %i[last_name first_name father_name id phone telegram email git].each do |attr|
94
- attr_val = send(attr)
95
- attrs[attr] = attr_val unless attr_val.nil?
96
- end
97
- attrs
98
- end
99
-
100
- def to_json_str
101
- JSON.generate(to_hash)
102
- end
103
- end