shnaider_code 1.1.5 → 2.0.0
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.
- checksums.yaml +4 -4
- data/lib/shnaider_code/version.rb +1 -1
- data/lib/source/attr_limited_regex_accessor.rb +43 -0
- data/lib/source/controllers/create_student_controller.rb +8 -0
- data/lib/source/controllers/edit_student_controller.rb +10 -0
- data/lib/source/controllers/view_controller.rb +106 -0
- data/lib/source/data_construct_pattern/data_construct_pattarn.rb +25 -0
- data/lib/source/data_list.rb +59 -0
- data/lib/source/data_list_student_short.rb +28 -0
- data/lib/source/data_table.rb +21 -0
- data/lib/source/database/scripts/create_table.sql +10 -0
- data/lib/source/database/scripts/fill_data.sql +14 -0
- data/lib/source/database/students_db.rb +78 -0
- data/lib/source/database/students_list_db.rb +36 -0
- data/lib/source/student/abstract_student.rb +26 -0
- data/lib/source/student/student.rb +120 -0
- data/lib/source/student/student_short.rb +59 -0
- data/lib/source/student_list_format.rb +50 -0
- data/lib/source/students_list.rb +43 -0
- data/lib/source/students_list_adapter.rb +89 -0
- data/lib/source/students_list_format_strategy.rb +59 -0
- data/lib/source/students_tests.rb +72 -0
- data/shnaider_code.gemspec +4 -6
- metadata +25 -33
- data/CHANGELOG.md +0 -5
- data/CODE_OF_CONDUCT.md +0 -84
- data/Documentation.md +0 -33
- data/Gemfile +0 -13
- data/Gemfile.lock +0 -92
- data/lib/source/controllers/student_input_form/student_input_form_controller_create.rb +0 -68
- data/lib/source/controllers/student_input_form/student_input_form_controller_edit.rb +0 -78
- data/lib/source/controllers/tab_students_controller.rb +0 -104
- data/lib/source/db_config/config.example.yaml +0 -5
- data/lib/source/db_config/migrations/001_create_table_student.sql +0 -12
- data/lib/source/db_config/mock_data/fill_student.sql +0 -6
- data/lib/source/models/student.rb +0 -125
- data/lib/source/models/student_base.rb +0 -128
- data/lib/source/models/student_short.rb +0 -58
- data/lib/source/repositories/adapters/db_source_adapter.rb +0 -54
- data/lib/source/repositories/adapters/file_source_adapter.rb +0 -37
- data/lib/source/repositories/containers/data_list.rb +0 -74
- data/lib/source/repositories/containers/data_list_student_short.rb +0 -18
- data/lib/source/repositories/containers/data_table.rb +0 -35
- data/lib/source/repositories/data_sources/db_data_source.rb +0 -35
- data/lib/source/repositories/data_sources/file_data_source.rb +0 -77
- data/lib/source/repositories/data_sources/transformers/data_transformer_base.rb +0 -15
- data/lib/source/repositories/data_sources/transformers/data_transformer_json.rb +0 -16
- data/lib/source/repositories/data_sources/transformers/data_transformer_yaml.rb +0 -16
- data/lib/source/repositories/student_repository.rb +0 -37
- data/lib/source/util/logger_holder.rb +0 -29
- data/shnaider_code-1.1.4.gem +0 -0
- data/sig/shnaider_code.rbs +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfb1264019ef4c0bff860b6dc0b31605d178ccedefd0042673ce582fcd9aceed
|
4
|
+
data.tar.gz: 6c1006332c4ead83f3c96bb9511bc7207759324ad09484203ea2827aa2054424
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d1cadef5921778d113af10604e9d67e398311618cc72c65aeb50860275f7158363fde04610e8bc852e3e0e3417f2fff865bfa2405d47573968c5c488fba548d
|
7
|
+
data.tar.gz: 273aadd1b95aaf3d1658a65217e7fdc784a84194c8b8d26c6d82aa4972107f2e0c50ef88bc6dd9745ea42abc4ffb7fe1150e161f1ee35934ce64e3f35a560458
|
@@ -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,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,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
|