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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e48a27d5a278939a30bee3a0ae4b09877d669eff51d5c1d3bd75fd449075261
4
- data.tar.gz: f1a81eac5c6880152bde397e218d4d0ae19eb3b79667cd3cc18e76cab607b211
3
+ metadata.gz: 1e7944c0fb66d7ce5ffc5da0ae8f27590d90fd9fe4e00983d64f44d295f61b60
4
+ data.tar.gz: f15a4a429ddb7d71d44e8867c23956ec7fd1aa77781a5bf4e5e9fa15a1fd27f7
5
5
  SHA512:
6
- metadata.gz: 4ea9dfc5ce7a15aecc3a7f97125e018a17a0d82ac9ebb5fb7371e8a40968790309a1ed3dc7b8803f3b6edb82c3c7eb6feb9979e49f92040486960d1e2b822436
7
- data.tar.gz: 7cb5d288b765e6bf5fc39733251ade4704493b2da9281d2fc3fcf8c89971d1f029ff205c14b3070c2bc50c9e58f5db8884b2e1552198cbf27adf7b205e83a292
6
+ metadata.gz: 27e403d2dbe4138fb7aa1bf04c0b64b86e3e17d0b9b74fdc7742450f2e60845038120870a1b5ac359db9579c4735ee348366ca6dcffdee5a7e363e4b581b5bde
7
+ data.tar.gz: bc8fb225ba066038cdddb7c342d695e10bbdda16a14037c03ed09087b9228f5f79e09b319e350614345634d0f03403bc6606c50947f1e6d9a02c2d9c9447c876
@@ -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.1"
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