shnaider_code 1.1.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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/lib/source/students_tests.rb +72 -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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e48a27d5a278939a30bee3a0ae4b09877d669eff51d5c1d3bd75fd449075261
4
- data.tar.gz: f1a81eac5c6880152bde397e218d4d0ae19eb3b79667cd3cc18e76cab607b211
3
+ metadata.gz: bfb1264019ef4c0bff860b6dc0b31605d178ccedefd0042673ce582fcd9aceed
4
+ data.tar.gz: 6c1006332c4ead83f3c96bb9511bc7207759324ad09484203ea2827aa2054424
5
5
  SHA512:
6
- metadata.gz: 4ea9dfc5ce7a15aecc3a7f97125e018a17a0d82ac9ebb5fb7371e8a40968790309a1ed3dc7b8803f3b6edb82c3c7eb6feb9979e49f92040486960d1e2b822436
7
- data.tar.gz: 7cb5d288b765e6bf5fc39733251ade4704493b2da9281d2fc3fcf8c89971d1f029ff205c14b3070c2bc50c9e58f5db8884b2e1552198cbf27adf7b205e83a292
6
+ metadata.gz: 2d1cadef5921778d113af10604e9d67e398311618cc72c65aeb50860275f7158363fde04610e8bc852e3e0e3417f2fff865bfa2405d47573968c5c488fba548d
7
+ data.tar.gz: 273aadd1b95aaf3d1658a65217e7fdc784a84194c8b8d26c6d82aa4972107f2e0c50ef88bc6dd9745ea42abc4ffb7fe1150e161f1ee35934ce64e3f35a560458
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Shnaider
4
- VERSION = "1.1.6"
3
+ module ShnaiderCode
4
+ VERSION = "2.0.0"
5
5
  end
data/lib/shnaider_code.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  require_relative "shnaider_code/version"
4
4
 
5
- module Shnaider
5
+ module ShnaiderCode
6
6
  Dir[File.dirname(__FILE__) + '/source/**/*.rb'].each { |file|
7
7
  puts file
8
8
  require file
@@ -0,0 +1,43 @@
1
+ def attr_limited_regex_accessor(symbol, regex)
2
+ class_eval %{
3
+ def #{symbol}
4
+ @#{symbol}
5
+ end
6
+
7
+ def #{symbol}=(new_value)
8
+ if new_value != nil && new_value !~ #{regex}
9
+ raise "invalid #{symbol} format"
10
+ end
11
+
12
+ @#{symbol} = new_value
13
+ end
14
+ }
15
+ end
16
+
17
+ def attr_private_limited_regex_accessor(symbol, regex)
18
+ class_eval %{
19
+ def #{symbol}
20
+ @#{symbol}
21
+ end
22
+
23
+ private def #{symbol}=(new_value)
24
+ if new_value != nil && new_value !~ #{regex}
25
+ raise "invalid #{symbol} format"
26
+ end
27
+
28
+ @#{symbol} = new_value
29
+ end
30
+ }
31
+ end
32
+
33
+ def attr_private_accessor(symbol)
34
+ class_eval %{
35
+ private def #{symbol}
36
+ @#{symbol}
37
+ end
38
+
39
+ private def #{symbol}=(new_value)
40
+ @#{symbol} = new_value
41
+ end
42
+ }
43
+ end
@@ -0,0 +1,8 @@
1
+ module McDelta
2
+ class CreateStudentController
3
+ attr_accessor :onCreate
4
+
5
+ def initialize()
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module McDelta
2
+ class EditStudentController
3
+ attr_accessor :onCreate
4
+ attr_reader :edit_user_id
5
+
6
+ def initialize(student)
7
+ @edit_user_id = student.id
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,106 @@
1
+ require 'source/data_construct_pattern/data_construct_pattarn.rb'
2
+ require 'source/controllers/create_student_controller.rb'
3
+ require 'source/controllers/edit_student_controller.rb'
4
+ require 'source/attr_limited_regex_accessor.rb'
5
+ require 'logger'
6
+
7
+ module McDelta
8
+ class ViewController
9
+ attr_private_accessor :model
10
+ attr_accessor :data_list
11
+
12
+ attr_accessor :selected_page
13
+
14
+ attr_accessor :on_update_data
15
+
16
+ attr_accessor :on_add_student_clicked
17
+ attr_accessor :on_edit_student_clicked
18
+
19
+ attr_private_accessor :logger
20
+
21
+ def initialize(model, &on_update_data)
22
+ self.model = model
23
+ self.on_update_data = on_update_data
24
+
25
+ self.selected_page = 0
26
+
27
+ self.data_list = DataListStudentShort.new(list: [], data_constructor: DefaultDataConstructPattern.new())
28
+ self.model.get_students(0, 10, self.data_list)
29
+
30
+ self.logger = Logger.new('controller.log')
31
+ end
32
+ end
33
+
34
+
35
+ # StudentsListViewDelegate
36
+ class ViewController
37
+ def pages_count
38
+ (model.count / 10.0).ceil
39
+ end
40
+
41
+ def table_columns
42
+ self.data_list.get_names
43
+ end
44
+
45
+ def next_page
46
+ if self.selected_page != self.pages_count - 1
47
+ self.selected_page += 1
48
+ end
49
+
50
+ puts self.selected_page
51
+
52
+ update_table()
53
+ end
54
+
55
+ def last_page
56
+ if self.selected_page != 0
57
+ self.selected_page -= 1
58
+ end
59
+
60
+ puts self.selected_page
61
+
62
+
63
+ update_table()
64
+ end
65
+
66
+ def update_table
67
+ begin
68
+ model.get_students(self.selected_page * 10, (self.selected_page + 1) * 10, self.data_list)
69
+ rescue
70
+ logger.error('error in db connection')
71
+ end
72
+ self.on_update_data.call()
73
+ end
74
+
75
+ def open_student_creation_window()
76
+ self.logger.info('creating student window open')
77
+ on_add_student_clicked.call()
78
+ end
79
+
80
+ def open_student_editing_window(id)
81
+ self.logger.info('editing student window open')
82
+ on_edit_student_clicked.call(id)
83
+ end
84
+
85
+ def remove_student(id)
86
+ self.logger.info("student with id #{id} deleted")
87
+ model.remove_student(id)
88
+ update_table()
89
+ end
90
+
91
+ def add_student(student)
92
+ self.logger.info("new student added")
93
+ model.add_student(student)
94
+ puts model.count
95
+ end
96
+
97
+ def get_student(id)
98
+ model.get_student(id)
99
+ end
100
+
101
+ def replace_student(id, student)
102
+ self.logger.info("student with id #{id} updated")
103
+ model.replace_student(id, student)
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,25 @@
1
+ module McDelta
2
+ class DataConstructPattern
3
+ def execute(values, attrs)
4
+ raise 'Метод не реализован'
5
+ end
6
+ end
7
+
8
+ class DefaultDataConstructPattern
9
+ def execute(values, attrs)
10
+ (0...values.size).map { |item_index|
11
+ [
12
+ values[item_index].id,
13
+ values[item_index].lastname,
14
+ values[item_index].firstname,
15
+ values[item_index].patronymic,
16
+ values[item_index].git,
17
+ values[item_index].telegram,
18
+ values[item_index].phone,
19
+ values[item_index].email
20
+ ]
21
+ }
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,59 @@
1
+ module McDelta
2
+ module DataListObserver
3
+ def notify(data)
4
+ raise 'not implemented'
5
+ end
6
+ end
7
+
8
+ module DataListNotifier
9
+ attr_accessor :data_list_observers
10
+
11
+ def notify
12
+ raise 'not implemented'
13
+ end
14
+ end
15
+
16
+ class DataList
17
+ attr_accessor :list
18
+ attr_private_accessor :selected_objects
19
+ def initialize(list:)
20
+ self.data_list_observers = []
21
+ self.list = list
22
+ end
23
+
24
+ def select(index)
25
+ selected_objects << index
26
+ end
27
+
28
+ def get_selected_objects
29
+ (0...list.size)
30
+ .filter { |x| selected_objects.include? x }
31
+ end
32
+
33
+ def get_names
34
+ raise "Метод не реализован"
35
+ end
36
+
37
+ def get_data
38
+ raise "Метод не реализован"
39
+ end
40
+ end
41
+
42
+ class DataList
43
+ include DataListNotifier
44
+
45
+ def notify
46
+ data_list_observers.each { |observer|
47
+ observer.notify(self.get_data)
48
+ }
49
+ end
50
+
51
+ def add_observer(observer)
52
+ self.data_list_observers << observer
53
+ end
54
+
55
+ def remove_observer(observer)
56
+ self.data_list_observers.delete(observer)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,28 @@
1
+ require 'source/data_list.rb'
2
+ require 'source/data_table.rb'
3
+
4
+ module McDelta
5
+ class DataListStudentShort < DataList
6
+
7
+ attr_private_accessor :data_constructor
8
+
9
+ def initialize(list:, data_constructor:)
10
+ self.data_constructor = data_constructor
11
+
12
+ super(list: list)
13
+ end
14
+
15
+ def get_names
16
+ ["ID", "Фамилия", "Имя", "Отчество", "Гит", "Телега", "Телефон", "Почта"]
17
+ end
18
+
19
+ def get_data
20
+ self.data_constructor.execute(list, get_names)
21
+ end
22
+
23
+ def list=(new_list)
24
+ @list = new_list
25
+ notify()
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ module McDelta
2
+ class DataTable
3
+ attr_private_accessor :data
4
+
5
+ def initialize(data:)
6
+ self.data = data
7
+ end
8
+
9
+ def element(row:, column:)
10
+ data[row][column]
11
+ end
12
+
13
+ def columnsCount
14
+ data[0].size
15
+ end
16
+
17
+ def rowsCount
18
+ data.size
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ CREATE TABLE IF NOT EXISTS student(
2
+ id INT NOT NULL auto_increment PRIMARY KEY,
3
+ lastname CHAR(255) NOT NULL,
4
+ firstname CHAR(255) NOT NULL,
5
+ patronymic CHAR(255) NOT NULL,
6
+ git CHAR(255),
7
+ phone CHAR(255),
8
+ email CHAR(255),
9
+ telegram CHAR(255)
10
+ );
@@ -0,0 +1,14 @@
1
+ INSERT INTO student (lastname, firstname, patronymic, git, phone, email, telegram) VALUES
2
+ ROW("Шнайдер", "Ия", "Альбертовна", "@bushmrz", NULL, NULL, NULL),
3
+ ROW("Хахук", "Рустам", "Нальбиевич", "@deltanull", "+7-800-555-35-35", NULL, NULL),
4
+ ROW("Гиренко", "Даниил", "Евгениевич", "@iamgirya", NULL, "iamgirya@yandex.ru", NULL),
5
+ ROW("Худокмырлов", "Дмитрий", "Александрович", "@kitten_qz", NULL, "kittenbomba@yandex.ru", NULL),
6
+ ROW("Шнайдер", "Александр", "Павлович", "@invisible", NULL, NULL, @invisible),
7
+ ROW("Сайксова", "Северина", "Альбертовна", "@slowrunner3000", NULL, NULL, @slowrunner3000),
8
+ ROW("Худокормов", "Дмитрий", "Александрович", "@kitten_qzzz", NULL, "kittenbombaz@yandex.ru", NULL),
9
+ ROW("Шнайдер", "Ий", "Альбертович", "@shnaider", NULL, NULL, @shnaider),
10
+ ROW("Сайксов", "Олег", "Васильевич", "@olifmus", NULL, NULL, @music3000),
11
+ ROW("Водянов", "Андрей", "Александрович", "@ovipivo", NULL, "yandexfan@yandex.ru", NULL),
12
+ ROW("Фейков", "Александр", "Александрович", "@fakegit", NULL, NULL, @empty),
13
+ ROW("Сайксов", "Оливер", "Брингович", "@bmth", NULL, NULL, @olybmth),
14
+
@@ -0,0 +1,78 @@
1
+ require 'mysql2'
2
+
3
+ module McDelta
4
+
5
+ class StudentsDB
6
+ attr_private_accessor :db_connection
7
+
8
+ def initialize()
9
+ self.db_connection = Mysql2::Client.new(:host => "localhost", :username => "root")
10
+ self.db_connection.query('CREATE DATABASE IF NOT EXISTS my_db')
11
+ self.db_connection.query('USE my_db')
12
+ self.db_connection.query('DROP TABLE IF EXISTS student')
13
+ self.db_connection.query(File.read(File.dirname(__FILE__) + '/scripts/create_table.sql'))
14
+ self.fill_data()
15
+ end
16
+
17
+ private def fill_data()
18
+ db_connection.query(File.read(File.dirname(__FILE__) + '/scripts/fill_data.sql'))
19
+ end
20
+
21
+ def select_by_id(id)
22
+ db_connection.query("SELECT * FROM student WHERE id = #{id}").map { |x| x }[0]
23
+ end
24
+
25
+ def remove_by_id(id)
26
+ db_connection.query("DELETE FROM student WHERE id = #{id}")
27
+ end
28
+
29
+ def replace_by_id(id, student_json)
30
+ db_connection.query("DELETE FROM student WHERE id = #{id}")
31
+ db_connection.query("""
32
+ INSERT INTO student (id, lastname, firstname, patronymic, git, phone, email, telegram) VALUES
33
+ ROW(
34
+ \"#{id}\",
35
+ \"#{attr_or_null(student_json[:lastname])}\",
36
+ \"#{attr_or_null(student_json[:firstname])}\",
37
+ \"#{attr_or_null(student_json[:patronymic])}\",
38
+ \"#{attr_or_null(student_json[:git])}\",
39
+ \"#{attr_or_null(student_json[:phone])}\",
40
+ \"#{attr_or_null(student_json[:email])}\",
41
+ \"#{attr_or_null(student_json[:telegram])}\"
42
+ )
43
+ """)
44
+ end
45
+
46
+ def add_student(student_json)
47
+ puts student_json[:lastname]
48
+ db_connection.query("""
49
+ INSERT INTO student (lastname, firstname, patronymic, git, phone, email, telegram) VALUES
50
+ ROW(
51
+ \"#{attr_or_null(student_json[:lastname])}\",
52
+ \"#{attr_or_null(student_json[:firstname])}\",
53
+ \"#{attr_or_null(student_json[:patronymic])}\",
54
+ \"#{attr_or_null(student_json[:git])}\",
55
+ \"#{attr_or_null(student_json[:phone])}\",
56
+ \"#{attr_or_null(student_json[:email])}\",
57
+ \"#{attr_or_null(student_json[:telegram])}\"
58
+ )
59
+ """)
60
+ end
61
+
62
+ def select_students(from, to)
63
+ db_connection.query("SELECT * FROM student LIMIT #{from}, #{to}")
64
+ end
65
+
66
+ def count()
67
+ db_connection.query("SELECT * FROM student").count
68
+ end
69
+
70
+ private def attr_or_null(attr)
71
+ if attr == nil
72
+ "NULL"
73
+ else
74
+ attr
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,36 @@
1
+ require 'source/database/students_db.rb'
2
+
3
+ module McDelta
4
+ class StudentsListDB
5
+ private_class_method :new
6
+
7
+ def self.get_student(id)
8
+ Student.from_json(StudentsListDB.database.select_by_id(id))
9
+ end
10
+
11
+ def self.remove_student(id)
12
+ StudentsListDB.database.remove_by_id(id)
13
+ end
14
+
15
+ def self.replace_student(id, student)
16
+ StudentsListDB.database.replace_by_id(id, student.as_json)
17
+ end
18
+
19
+ def self.add_student(student)
20
+ StudentsListDB.database.add_student(student.as_json)
21
+ end
22
+
23
+ def self.get_students_slice(from, to)
24
+ StudentsListDB.database.select_students(from, to).map { |x| Student.from_json(x) }
25
+ end
26
+
27
+ def self.count()
28
+ StudentsListDB.database.count()
29
+ end
30
+
31
+ def self.database
32
+ @database ||= StudentsDB.new()
33
+ @database
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ module McDelta
2
+ class AbstractStudent
3
+ private_class_method :new
4
+ attr_accessor :lastname, :firstname, :patronymic, :id
5
+
6
+ def get_info
7
+ raise "method not implemented"
8
+ end
9
+
10
+ def fio_info
11
+ raise "method not implemented"
12
+ end
13
+
14
+ def contacts_info
15
+ raise "method not implemented"
16
+ end
17
+
18
+ def to_s
19
+ get_info
20
+ end
21
+
22
+ def as_json
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,120 @@
1
+ require "source/attr_limited_regex_accessor.rb"
2
+ require "source/student/abstract_student.rb"
3
+
4
+ module McDelta
5
+ class Student < AbstractStudent
6
+ attr_limited_regex_accessor :phone, '/\d-\d{3}-\d{3}-\d{2}-\d{2}/'
7
+ attr_limited_regex_accessor :email, '/\w*@\w*.\w{2,3}/'
8
+ attr_limited_regex_accessor :telegram, '/@\w*/'
9
+ attr_limited_regex_accessor :git, '/@\w*/'
10
+
11
+ public_class_method :new
12
+
13
+ def initialize(
14
+ lastname:,
15
+ firstname:,
16
+ patronymic:,
17
+ params: {}
18
+ )
19
+ self.lastname = lastname
20
+ self.firstname = firstname
21
+ self.patronymic = patronymic
22
+ self.id = params[:id]
23
+
24
+ self.phone = params[:phone]
25
+ self.telegram = params[:telegram]
26
+ self.email = params[:email]
27
+ self.git = params[:git]
28
+
29
+ validate()
30
+ end
31
+
32
+ def self.from_json(json)
33
+ params = json.map { |v|
34
+ [v[0].to_sym, v[1]]
35
+ }.filter { |v|
36
+ v[1] != "NULL"
37
+ }.to_h
38
+
39
+ Student.new(
40
+ lastname: json["lastname"],
41
+ firstname: json["firstname"],
42
+ patronymic: json["patronymic"],
43
+ params: params
44
+ )
45
+ end
46
+
47
+ def self.from_string(str)
48
+ params = str
49
+ .split(";")
50
+ .map { |x| x.split(":") }
51
+ .map { |x| [x[0].to_sym, x[1]] }
52
+ .to_h
53
+
54
+ if params[:fio] == nil
55
+ raise "invalid string representation"
56
+ end
57
+
58
+ fio_components = params[:fio].split(" ")
59
+
60
+ Student.new(
61
+ lastname: fio_components[0],
62
+ firstname: fio_components[1],
63
+ patronymic: fio_components[2],
64
+ params: params
65
+ )
66
+ end
67
+
68
+ def have_any_contact
69
+ phone != nil || telegram != nil || email != nil || git != nil
70
+ end
71
+
72
+ def validate
73
+ if !have_any_contact
74
+ raise "Not finded git or any contact"
75
+ end
76
+ end
77
+
78
+ def set_contacts(phone: nil, email: nil, git: nil, telegram: nil)
79
+ if phone != nil then self.phone = phone end
80
+ if email != nil then self.email = email end
81
+ if git != nil then self.git = git end
82
+ if telegram != nil then self.telegram = telegram end
83
+ end
84
+
85
+ def contacts_info
86
+ contacts = ""
87
+ if git != nil then contacts << "git:#{git};" end
88
+ if phone != nil then contacts << "phone:#{phone};" end
89
+ if email != nil then contacts << "email:#{email};" end
90
+ if telegram != nil then contacts << "telegram:#{telegram};" end
91
+
92
+ contacts
93
+ end
94
+
95
+ def get_info
96
+ if id != nil
97
+ "id:#{id};#{fio_info};#{contacts_info}"
98
+ else
99
+ "#{fio_info};#{contacts_info}"
100
+ end
101
+ end
102
+
103
+ def fio_info
104
+ "fio:#{lastname} #{firstname} #{patronymic}"
105
+ end
106
+
107
+ def as_json
108
+ {
109
+ lastname: lastname,
110
+ firstname: firstname,
111
+ patronymic: patronymic,
112
+ id: id,
113
+ phone: phone,
114
+ email: email,
115
+ git: git,
116
+ telegram: telegram
117
+ }
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,59 @@
1
+ require "source/attr_limited_regex_accessor.rb"
2
+ require "source/student/abstract_student.rb"
3
+
4
+ module McDelta
5
+ class StudentShort < AbstractStudent
6
+ attr_private_limited_regex_accessor :git, '/@\w*/'
7
+ attr_private_limited_regex_accessor :email, '/\w*@\w*.\w{2,3}/'
8
+
9
+ public_class_method :new
10
+
11
+ def initialize(id:, fio:, git:, email:)
12
+ fio_components = fio.split(" ")
13
+
14
+ self.id = id
15
+ self.firstname = fio_components[0]
16
+ self.lastname = fio_components[1]
17
+ self.patronymic = fio_components[2]
18
+
19
+ self.git = git
20
+ self.email = email
21
+ end
22
+
23
+ def self.from_student(student)
24
+ StudentShort.new(
25
+ id: student.id,
26
+ fio: "#{student.firstname} #{student.lastname} #{student.patronymic}",
27
+ git: student.git,
28
+ email: student.email
29
+ )
30
+ end
31
+
32
+ def self.from_string(id, info)
33
+ params = info
34
+ .split(";")
35
+ .map { |x| x.split(":") }
36
+ .map { |x| [x[0].to_sym, x[1]] }
37
+ .to_h
38
+
39
+ StudentShort.new(
40
+ id: id,
41
+ fio: params[:fio],
42
+ git: params[:git],
43
+ email: params[:email]
44
+ )
45
+ end
46
+
47
+ def fio_info
48
+ "fio:#{firstname} #{lastname.upcase[0]} #{patronymic.upcase[0]}"
49
+ end
50
+
51
+ def contacts_info
52
+ "git:#{git};email:#{email}"
53
+ end
54
+
55
+ def get_info
56
+ [fio_info, contacts_info].join(";")
57
+ end
58
+ end
59
+ end