model_gem 0.1.6
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 +7 -0
- data/model_gem_source/attr_limited_regex_accessor.rb +43 -0
- data/model_gem_source/controllers/create_student_controller.rb +10 -0
- data/model_gem_source/controllers/edit_student_controller.rb +11 -0
- data/model_gem_source/controllers/view_controller.rb +96 -0
- data/model_gem_source/data_construct_pattern/data_construct_pattarn.rb +23 -0
- data/model_gem_source/data_list.rb +57 -0
- data/model_gem_source/data_list_student_short.rb +26 -0
- data/model_gem_source/data_table.rb +19 -0
- data/model_gem_source/database/scripts/create_table.sql +10 -0
- data/model_gem_source/database/scripts/fill_data.sql +4 -0
- data/model_gem_source/database/students_db.rb +75 -0
- data/model_gem_source/database/students_list_db.rb +34 -0
- data/model_gem_source/student/abstract_student.rb +24 -0
- data/model_gem_source/student/student.rb +118 -0
- data/model_gem_source/student/student_short.rb +57 -0
- data/model_gem_source/student_list_format.rb +48 -0
- data/model_gem_source/students_list.rb +40 -0
- data/model_gem_source/students_list_adapter.rb +87 -0
- data/model_gem_source/students_list_format_strategy.rb +57 -0
- data/model_gem_source/students_tests.rb +70 -0
- metadata +64 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: fc216b10492287ed87310ed44a72856af3406f52f12b9782a48a2b92a59f1825
|
|
4
|
+
data.tar.gz: bc1b8e97cf6bc9b848fc9dde233a99d160dfefe2163a5d9defd87169ace390e1
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 2bd894bf9273785e935270c16c75b954ae09c95ac45077f90c10f0fbd806f5023bb11dfc1874f8950ed81a709e64dd5f49895768e259ea1170a4189505142760
|
|
7
|
+
data.tar.gz: b6627b989086eac801965da333a7d119ad9a7561972ba68183781f2e860b418aee8a5e48d7347b86e79deca41d32e4f8a18746b4e739839f7b2c77db83202ca7
|
|
@@ -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,96 @@
|
|
|
1
|
+
require_relative './../../data_construct_pattern/data_construct_pattarn.rb'
|
|
2
|
+
require_relative './main_view.rb'
|
|
3
|
+
require_relative './../create_student_window/create_student_controller.rb'
|
|
4
|
+
require_relative './../create_student_window/edit_student_controller.rb'
|
|
5
|
+
|
|
6
|
+
class ViewController
|
|
7
|
+
attr_private_accessor :model
|
|
8
|
+
attr_private_accessor :view
|
|
9
|
+
attr_private_accessor :data_list
|
|
10
|
+
|
|
11
|
+
attr_accessor :selected_page
|
|
12
|
+
|
|
13
|
+
def initialize(model)
|
|
14
|
+
self.model = model
|
|
15
|
+
|
|
16
|
+
self.selected_page = 0
|
|
17
|
+
|
|
18
|
+
self.data_list = DataListStudentShort.new(list: [], data_constructor: DefaultDataConstructPattern.new())
|
|
19
|
+
self.model.get_students(0, 10, self.data_list)
|
|
20
|
+
|
|
21
|
+
self.view = MainView.new(self)
|
|
22
|
+
self.data_list.add_observer(self.view.filter_tab)
|
|
23
|
+
|
|
24
|
+
update_table()
|
|
25
|
+
|
|
26
|
+
self.view.window_view.open
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# StudentsListViewDelegate
|
|
32
|
+
class ViewController
|
|
33
|
+
def pages_count
|
|
34
|
+
(model.count / 10.0).ceil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def table_columns
|
|
38
|
+
self.data_list.get_names
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def next_page
|
|
42
|
+
if self.selected_page != self.pages_count - 1
|
|
43
|
+
self.selected_page += 1
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
puts self.selected_page
|
|
47
|
+
|
|
48
|
+
update_table()
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def last_page
|
|
52
|
+
if self.selected_page != 0
|
|
53
|
+
self.selected_page -= 1
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
puts self.selected_page
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
update_table()
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def update_table
|
|
63
|
+
model.get_students(self.selected_page * 10, (self.selected_page + 1) * 10, self.data_list)
|
|
64
|
+
self.view.filter_tab.next_page_button.enabled = self.selected_page != self.pages_count - 1
|
|
65
|
+
self.view.filter_tab.last_page_button.enabled = self.selected_page != 0
|
|
66
|
+
|
|
67
|
+
self.view.filter_tab.table_title.text = (self.selected_page + 1).to_s + " из " + self.pages_count.to_s
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def open_student_creation_window()
|
|
71
|
+
controller = CreateStudentController.new()
|
|
72
|
+
controller.onCreate = lambda { |student|
|
|
73
|
+
puts student
|
|
74
|
+
model.add_student(student)
|
|
75
|
+
update_table()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
controller.ui.present
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def open_student_editing_window(id)
|
|
82
|
+
student = model.get_student(id)
|
|
83
|
+
controller = EditStudentController.new(student)
|
|
84
|
+
controller.onCreate = lambda { |student|
|
|
85
|
+
model.replace_student(controller.edit_user_id, student)
|
|
86
|
+
update_table()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
controller.ui.present
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def remove_student(id)
|
|
93
|
+
model.remove_student(id)
|
|
94
|
+
update_table()
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class DataConstructPattern
|
|
2
|
+
def execute(values, attrs)
|
|
3
|
+
raise 'Метод не реализован'
|
|
4
|
+
end
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
class DefaultDataConstructPattern
|
|
8
|
+
def execute(values, attrs)
|
|
9
|
+
(0...values.size).map { |item_index|
|
|
10
|
+
[
|
|
11
|
+
values[item_index].id,
|
|
12
|
+
values[item_index].lastname,
|
|
13
|
+
values[item_index].firstname,
|
|
14
|
+
values[item_index].patronymic,
|
|
15
|
+
values[item_index].git,
|
|
16
|
+
values[item_index].telegram,
|
|
17
|
+
values[item_index].phone,
|
|
18
|
+
values[item_index].email
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module DataListObserver
|
|
2
|
+
def notify(data)
|
|
3
|
+
raise 'not implemented'
|
|
4
|
+
end
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module DataListNotifier
|
|
8
|
+
attr_accessor :data_list_observers
|
|
9
|
+
|
|
10
|
+
def notify
|
|
11
|
+
raise 'not implemented'
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class DataList
|
|
16
|
+
attr_accessor :list
|
|
17
|
+
attr_private_accessor :selected_objects
|
|
18
|
+
def initialize(list:)
|
|
19
|
+
self.data_list_observers = []
|
|
20
|
+
self.list = list
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def select(index)
|
|
24
|
+
selected_objects << index
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def get_selected_objects
|
|
28
|
+
(0...list.size)
|
|
29
|
+
.filter { |x| selected_objects.include? x }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def get_names
|
|
33
|
+
raise "Метод не реализован"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def get_data
|
|
37
|
+
raise "Метод не реализован"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class DataList
|
|
42
|
+
include DataListNotifier
|
|
43
|
+
|
|
44
|
+
def notify
|
|
45
|
+
data_list_observers.each { |observer|
|
|
46
|
+
observer.notify(self.get_data)
|
|
47
|
+
}
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def add_observer(observer)
|
|
51
|
+
self.data_list_observers << observer
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def remove_observer(observer)
|
|
55
|
+
self.data_list_observers.delete(observer)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require_relative './data_list.rb'
|
|
2
|
+
require_relative './data_table.rb'
|
|
3
|
+
|
|
4
|
+
class DataListStudentShort < DataList
|
|
5
|
+
|
|
6
|
+
attr_private_accessor :data_constructor
|
|
7
|
+
|
|
8
|
+
def initialize(list:, data_constructor:)
|
|
9
|
+
self.data_constructor = data_constructor
|
|
10
|
+
|
|
11
|
+
super(list: list)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get_names
|
|
15
|
+
["ID", "Фамилия", "Имя", "Отчество", "Гит", "Телега", "Телефон", "Почта"]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def get_data
|
|
19
|
+
self.data_constructor.execute(list, get_names)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def list=(new_list)
|
|
23
|
+
@list = new_list
|
|
24
|
+
notify()
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class DataTable
|
|
2
|
+
attr_private_accessor :data
|
|
3
|
+
|
|
4
|
+
def initialize(data:)
|
|
5
|
+
self.data = data
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def element(row:, column:)
|
|
9
|
+
data[row][column]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def columnsCount
|
|
13
|
+
data[0].size
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def rowsCount
|
|
17
|
+
data.size
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
INSERT INTO student (lastname, firstname, patronymic, git, phone, email, telegram) VALUES
|
|
2
|
+
ROW("Хахук", "Рустам", "Нальбиевич", "@Null-Delta", NULL, NULL, NULL),
|
|
3
|
+
ROW("Нагалевский", "Артем", "Михайлович", "@Jakeapps", "+7-800-555-35-35", NULL, NULL),
|
|
4
|
+
ROW("Гиренко", "Даниил", "Евгениевич", "@iamgirya", NULL, "iamgirya@yandex.ru", NULL)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require 'mysql2'
|
|
2
|
+
|
|
3
|
+
class StudentsDB
|
|
4
|
+
attr_private_accessor :db_connection
|
|
5
|
+
|
|
6
|
+
def initialize()
|
|
7
|
+
self.db_connection = Mysql2::Client.new(:host => "localhost", :username => "root")
|
|
8
|
+
self.db_connection.query('CREATE DATABASE IF NOT EXISTS my_db')
|
|
9
|
+
self.db_connection.query('USE my_db')
|
|
10
|
+
self.db_connection.query('DROP TABLE IF EXISTS student')
|
|
11
|
+
self.db_connection.query(File.read('database/scripts/create_table.sql'))
|
|
12
|
+
self.fill_data()
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private def fill_data()
|
|
16
|
+
db_connection.query(File.read('database/scripts/fill_data.sql'))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def select_by_id(id)
|
|
20
|
+
db_connection.query("SELECT * FROM student WHERE id = #{id}").map { |x| x }[0]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def remove_by_id(id)
|
|
24
|
+
db_connection.query("DELETE FROM student WHERE id = #{id}")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def replace_by_id(id, student_json)
|
|
28
|
+
db_connection.query("DELETE FROM student WHERE id = #{id}")
|
|
29
|
+
db_connection.query("""
|
|
30
|
+
INSERT INTO student (id, lastname, firstname, patronymic, git, phone, email, telegram) VALUES
|
|
31
|
+
ROW(
|
|
32
|
+
\"#{id}\",
|
|
33
|
+
\"#{attr_or_null(student_json[:lastname])}\",
|
|
34
|
+
\"#{attr_or_null(student_json[:firstname])}\",
|
|
35
|
+
\"#{attr_or_null(student_json[:patronymic])}\",
|
|
36
|
+
\"#{attr_or_null(student_json[:git])}\",
|
|
37
|
+
\"#{attr_or_null(student_json[:phone])}\",
|
|
38
|
+
\"#{attr_or_null(student_json[:email])}\",
|
|
39
|
+
\"#{attr_or_null(student_json[:telegram])}\"
|
|
40
|
+
)
|
|
41
|
+
""")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def add_student(student_json)
|
|
45
|
+
puts student_json[:lastname]
|
|
46
|
+
db_connection.query("""
|
|
47
|
+
INSERT INTO student (lastname, firstname, patronymic, git, phone, email, telegram) VALUES
|
|
48
|
+
ROW(
|
|
49
|
+
\"#{attr_or_null(student_json[:lastname])}\",
|
|
50
|
+
\"#{attr_or_null(student_json[:firstname])}\",
|
|
51
|
+
\"#{attr_or_null(student_json[:patronymic])}\",
|
|
52
|
+
\"#{attr_or_null(student_json[:git])}\",
|
|
53
|
+
\"#{attr_or_null(student_json[:phone])}\",
|
|
54
|
+
\"#{attr_or_null(student_json[:email])}\",
|
|
55
|
+
\"#{attr_or_null(student_json[:telegram])}\"
|
|
56
|
+
)
|
|
57
|
+
""")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def select_students(from, to)
|
|
61
|
+
db_connection.query("SELECT * FROM student LIMIT #{from}, #{to}")
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def count()
|
|
65
|
+
db_connection.query("SELECT * FROM student").count
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private def attr_or_null(attr)
|
|
69
|
+
if attr == nil
|
|
70
|
+
"NULL"
|
|
71
|
+
else
|
|
72
|
+
attr
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require_relative './students_db.rb'
|
|
2
|
+
|
|
3
|
+
class StudentsListDB
|
|
4
|
+
private_class_method :new
|
|
5
|
+
|
|
6
|
+
def self.get_student(id)
|
|
7
|
+
Student.from_json(StudentsListDB.database.select_by_id(id))
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.remove_student(id)
|
|
11
|
+
StudentsListDB.database.remove_by_id(id)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.replace_student(id, student)
|
|
15
|
+
StudentsListDB.database.replace_by_id(id, student.as_json)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.add_student(student)
|
|
19
|
+
StudentsListDB.database.add_student(student.as_json)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.get_students_slice(from, to)
|
|
23
|
+
StudentsListDB.database.select_students(from, to).map { |x| Student.from_json(x) }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.count()
|
|
27
|
+
StudentsListDB.database.count()
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.database
|
|
31
|
+
@database ||= StudentsDB.new()
|
|
32
|
+
@database
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
class AbstractStudent
|
|
2
|
+
private_class_method :new
|
|
3
|
+
attr_accessor :lastname, :firstname, :patronymic, :id
|
|
4
|
+
|
|
5
|
+
def get_info
|
|
6
|
+
raise "method not implemented"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def fio_info
|
|
10
|
+
raise "method not implemented"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def contacts_info
|
|
14
|
+
raise "method not implemented"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_s
|
|
18
|
+
get_info
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def as_json
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require_relative "../attr_limited_regex_accessor.rb"
|
|
2
|
+
require_relative "./abstract_student.rb"
|
|
3
|
+
|
|
4
|
+
class Student < AbstractStudent
|
|
5
|
+
attr_limited_regex_accessor :phone, '/\d-\d{3}-\d{3}-\d{2}-\d{2}/'
|
|
6
|
+
attr_limited_regex_accessor :email, '/\w*@\w*.\w{2,3}/'
|
|
7
|
+
attr_limited_regex_accessor :telegram, '/@\w*/'
|
|
8
|
+
attr_limited_regex_accessor :git, '/@\w*/'
|
|
9
|
+
|
|
10
|
+
public_class_method :new
|
|
11
|
+
|
|
12
|
+
def initialize(
|
|
13
|
+
lastname:,
|
|
14
|
+
firstname:,
|
|
15
|
+
patronymic:,
|
|
16
|
+
params: {}
|
|
17
|
+
)
|
|
18
|
+
self.lastname = lastname
|
|
19
|
+
self.firstname = firstname
|
|
20
|
+
self.patronymic = patronymic
|
|
21
|
+
self.id = params[:id]
|
|
22
|
+
|
|
23
|
+
self.phone = params[:phone]
|
|
24
|
+
self.telegram = params[:telegram]
|
|
25
|
+
self.email = params[:email]
|
|
26
|
+
self.git = params[:git]
|
|
27
|
+
|
|
28
|
+
validate()
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.from_json(json)
|
|
32
|
+
params = json.map { |v|
|
|
33
|
+
[v[0].to_sym, v[1]]
|
|
34
|
+
}.filter { |v|
|
|
35
|
+
v[1] != "NULL"
|
|
36
|
+
}.to_h
|
|
37
|
+
|
|
38
|
+
Student.new(
|
|
39
|
+
lastname: json["lastname"],
|
|
40
|
+
firstname: json["firstname"],
|
|
41
|
+
patronymic: json["patronymic"],
|
|
42
|
+
params: params
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.from_string(str)
|
|
47
|
+
params = str
|
|
48
|
+
.split(";")
|
|
49
|
+
.map { |x| x.split(":") }
|
|
50
|
+
.map { |x| [x[0].to_sym, x[1]] }
|
|
51
|
+
.to_h
|
|
52
|
+
|
|
53
|
+
if params[:fio] == nil
|
|
54
|
+
raise "invalid string representation"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
fio_components = params[:fio].split(" ")
|
|
58
|
+
|
|
59
|
+
Student.new(
|
|
60
|
+
lastname: fio_components[0],
|
|
61
|
+
firstname: fio_components[1],
|
|
62
|
+
patronymic: fio_components[2],
|
|
63
|
+
params: params
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def have_any_contact
|
|
68
|
+
phone != nil || telegram != nil || email != nil || git != nil
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def validate
|
|
72
|
+
if !have_any_contact
|
|
73
|
+
raise "Not finded git or any contact"
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def set_contacts(phone: nil, email: nil, git: nil, telegram: nil)
|
|
78
|
+
if phone != nil then self.phone = phone end
|
|
79
|
+
if email != nil then self.email = email end
|
|
80
|
+
if git != nil then self.git = git end
|
|
81
|
+
if telegram != nil then self.telegram = telegram end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def contacts_info
|
|
85
|
+
contacts = ""
|
|
86
|
+
if git != nil then contacts << "git:#{git};" end
|
|
87
|
+
if phone != nil then contacts << "phone:#{phone};" end
|
|
88
|
+
if email != nil then contacts << "email:#{email};" end
|
|
89
|
+
if telegram != nil then contacts << "telegram:#{telegram};" end
|
|
90
|
+
|
|
91
|
+
contacts
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def get_info
|
|
95
|
+
if id != nil
|
|
96
|
+
"id:#{id};#{fio_info};#{contacts_info}"
|
|
97
|
+
else
|
|
98
|
+
"#{fio_info};#{contacts_info}"
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def fio_info
|
|
103
|
+
"fio:#{lastname} #{firstname} #{patronymic}"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def as_json
|
|
107
|
+
{
|
|
108
|
+
lastname: lastname,
|
|
109
|
+
firstname: firstname,
|
|
110
|
+
patronymic: patronymic,
|
|
111
|
+
id: id,
|
|
112
|
+
phone: phone,
|
|
113
|
+
email: email,
|
|
114
|
+
git: git,
|
|
115
|
+
telegram: telegram
|
|
116
|
+
}
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require_relative "../attr_limited_regex_accessor.rb"
|
|
2
|
+
require_relative "./abstract_student.rb"
|
|
3
|
+
|
|
4
|
+
class StudentShort < AbstractStudent
|
|
5
|
+
attr_private_limited_regex_accessor :git, '/@\w*/'
|
|
6
|
+
attr_private_limited_regex_accessor :email, '/\w*@\w*.\w{2,3}/'
|
|
7
|
+
|
|
8
|
+
public_class_method :new
|
|
9
|
+
|
|
10
|
+
def initialize(id:, fio:, git:, email:)
|
|
11
|
+
fio_components = fio.split(" ")
|
|
12
|
+
|
|
13
|
+
self.id = id
|
|
14
|
+
self.firstname = fio_components[0]
|
|
15
|
+
self.lastname = fio_components[1]
|
|
16
|
+
self.patronymic = fio_components[2]
|
|
17
|
+
|
|
18
|
+
self.git = git
|
|
19
|
+
self.email = email
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.from_student(student)
|
|
23
|
+
StudentShort.new(
|
|
24
|
+
id: student.id,
|
|
25
|
+
fio: "#{student.firstname} #{student.lastname} #{student.patronymic}",
|
|
26
|
+
git: student.git,
|
|
27
|
+
email: student.email
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.from_string(id, info)
|
|
32
|
+
params = info
|
|
33
|
+
.split(";")
|
|
34
|
+
.map { |x| x.split(":") }
|
|
35
|
+
.map { |x| [x[0].to_sym, x[1]] }
|
|
36
|
+
.to_h
|
|
37
|
+
|
|
38
|
+
StudentShort.new(
|
|
39
|
+
id: id,
|
|
40
|
+
fio: params[:fio],
|
|
41
|
+
git: params[:git],
|
|
42
|
+
email: params[:email]
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def fio_info
|
|
47
|
+
"fio:#{firstname} #{lastname.upcase[0]} #{patronymic.upcase[0]}"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def contacts_info
|
|
51
|
+
"git:#{git};email:#{email}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def get_info
|
|
55
|
+
[fio_info, contacts_info].join(";")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
class StudentListFormat
|
|
2
|
+
attr_private_accessor :students
|
|
3
|
+
attr_accessor :formater
|
|
4
|
+
|
|
5
|
+
def initialize(formater)
|
|
6
|
+
self.formater = formater
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def read_from(filename)
|
|
10
|
+
self.students = formater.read_from(filename)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def write_to(filename)
|
|
14
|
+
formater.write_to(filename, self.students)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def get_student(id)
|
|
18
|
+
self.students.detect { |x|
|
|
19
|
+
x.id == id .to_s
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def add_student(student)
|
|
24
|
+
self.students << student
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def delete_student(id)
|
|
28
|
+
index = students.index(students.detect { |x| x.id == id.to_s })
|
|
29
|
+
self.students.delete_at(index)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def replace_student(id, student)
|
|
33
|
+
self.students.map! { |x| x.id == id.to_s ? student : x }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def get_students_slice(k, count)
|
|
37
|
+
from = [k * count, self.students.count].min
|
|
38
|
+
to = [self.students.count, from + count].min
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def count()
|
|
42
|
+
self.students.count
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def sort()
|
|
46
|
+
self.students.sort_by(&:fio_info)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require_relative "./attr_limited_regex_accessor.rb"
|
|
2
|
+
class StudentsList
|
|
3
|
+
attr_private_accessor :students_list_adapter
|
|
4
|
+
|
|
5
|
+
def initialize(adapter)
|
|
6
|
+
self.students_list_adapter = adapter
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def get_student(id)
|
|
10
|
+
students_list_adapter.get_student(id)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def remove_student(id)
|
|
14
|
+
students_list_adapter.remove_student(id)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def replace_student(id, student)
|
|
18
|
+
students_list_adapter.replace_student(id, student)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def get_students(from, to, data)
|
|
22
|
+
values = students_list_adapter.get_students(from, to)
|
|
23
|
+
|
|
24
|
+
if data == nil
|
|
25
|
+
data = DataList.new(list: values)
|
|
26
|
+
else
|
|
27
|
+
data.list = values
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
data.list
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def add_student(student)
|
|
34
|
+
students_list_adapter.add_student(student)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def count
|
|
38
|
+
students_list_adapter.count()
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
class StudentsListAdapter
|
|
2
|
+
def get_student(id)
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
def remove_student(id)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def replace_student(id, student, data)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def get_students(from, to, data)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def add_student(student)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def count
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class StudentsListDBAdapter < StudentsListAdapter
|
|
22
|
+
attr_private_accessor :database_list
|
|
23
|
+
|
|
24
|
+
def initialize(database_list)
|
|
25
|
+
self.database_list = database_list
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def get_student(id)
|
|
29
|
+
database_list.get_student(id)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def remove_student(id)
|
|
33
|
+
database_list.remove_student(id)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def replace_student(id, student)
|
|
37
|
+
database_list.replace_student(id, student)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def get_students(from, to)
|
|
41
|
+
database_list.get_students_slice(from, to)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def add_student(student)
|
|
45
|
+
database_list.add_student(student)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def count
|
|
49
|
+
database_list.count()
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class StudentsListFormatterAdapter < StudentsListAdapter
|
|
54
|
+
attr_private_accessor :formatter
|
|
55
|
+
|
|
56
|
+
def initialize(formatter, filename)
|
|
57
|
+
self.formatter = formatter
|
|
58
|
+
formatter.read_from(filename)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def get_student(id)
|
|
62
|
+
formatter.get_student(id)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def remove_student(id)
|
|
66
|
+
formatter.delete_student(id)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def replace_student(id, student)
|
|
70
|
+
formatter.replace_student(id, student)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def get_students(from, to)
|
|
74
|
+
count = to - from
|
|
75
|
+
k = from / count
|
|
76
|
+
|
|
77
|
+
formatter.get_students_slice(k, count)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def add_student(student)
|
|
81
|
+
formatter.add_student(student)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def count
|
|
85
|
+
formatter.count()
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
require 'yaml'
|
|
3
|
+
|
|
4
|
+
class StudentsListFormatStrategy
|
|
5
|
+
def read_from(filename)
|
|
6
|
+
require 'method not implemented'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def write_to(filename, students)
|
|
10
|
+
require 'method not implemented'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class TxtStudentsListFormatStrategy < StudentsListFormatStrategy
|
|
15
|
+
def read_from(filename)
|
|
16
|
+
File.read(filename)
|
|
17
|
+
.split("\n")
|
|
18
|
+
.map { |v| Student.from_string(v) }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def write_to(filename, students)
|
|
22
|
+
File.open(filename, 'w') { |file|
|
|
23
|
+
file.write(
|
|
24
|
+
students.map { |student|
|
|
25
|
+
student.get_info
|
|
26
|
+
}
|
|
27
|
+
.join("\n")
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class JsonStudentsListFormatStrategy < StudentsListFormatStrategy
|
|
34
|
+
def read_from(filename)
|
|
35
|
+
file = File.read(filename)
|
|
36
|
+
json = JSON.parse(file)
|
|
37
|
+
json.map { |x| Student.from_json(x) }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def write_to(filename, students)
|
|
41
|
+
File.open(filename, 'w') do |f|
|
|
42
|
+
f.write(JSON.generate(students.map { |x| x.as_json }))
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class YamlStudentsListFormatStrategy < StudentsListFormatStrategy
|
|
48
|
+
def read_from(filename)
|
|
49
|
+
YAML.load_file(filename)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def write_to(filename, students)
|
|
53
|
+
File.open(filename, 'w') do |file|
|
|
54
|
+
file.write(students.to_yaml)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require_relative "./students_list.rb"
|
|
3
|
+
require_relative "./attr_limited_regex_accessor.rb"
|
|
4
|
+
require_relative "./students_list_adapter.rb"
|
|
5
|
+
require_relative "./database/students_list_db.rb"
|
|
6
|
+
require_relative "./student/student.rb"
|
|
7
|
+
require_relative "./data_list.rb"
|
|
8
|
+
|
|
9
|
+
class StudentsTests < Test::Unit::TestCase
|
|
10
|
+
def test_add
|
|
11
|
+
@students = StudentsList.new(
|
|
12
|
+
StudentsListDBAdapter.new(
|
|
13
|
+
StudentsListDB
|
|
14
|
+
)
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
@start_count = @students.count
|
|
18
|
+
|
|
19
|
+
@students.add_student(
|
|
20
|
+
Student.new(
|
|
21
|
+
lastname: "AAA",
|
|
22
|
+
firstname: "BBB",
|
|
23
|
+
patronymic: "CCC",
|
|
24
|
+
params: {
|
|
25
|
+
email: "test@email.com"
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
assert_equal(1, @students.count - @start_count)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_delete
|
|
34
|
+
@students = StudentsList.new(
|
|
35
|
+
StudentsListDBAdapter.new(
|
|
36
|
+
StudentsListDB
|
|
37
|
+
)
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
@students.add_student(
|
|
41
|
+
Student.new(
|
|
42
|
+
lastname: "AAA",
|
|
43
|
+
firstname: "BBB",
|
|
44
|
+
patronymic: "CCC",
|
|
45
|
+
params: {
|
|
46
|
+
email: "test@email.com"
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
@students.add_student(
|
|
52
|
+
Student.new(
|
|
53
|
+
lastname: "AAA",
|
|
54
|
+
firstname: "BBB",
|
|
55
|
+
patronymic: "CCC",
|
|
56
|
+
params: {
|
|
57
|
+
email: "test@email.com"
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
@current_count = @students.count
|
|
63
|
+
|
|
64
|
+
@students_list = @students.get_students(0, 10, nil)
|
|
65
|
+
|
|
66
|
+
@students.remove_student(@students_list[0].id)
|
|
67
|
+
|
|
68
|
+
assert_equal(1, @current_count - @students.count)
|
|
69
|
+
end
|
|
70
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: model_gem
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.6
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Null_Delta
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2023-04-28 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: Гем с модельками и контроллерами
|
|
14
|
+
email:
|
|
15
|
+
- delta.null@vk.com
|
|
16
|
+
executables: []
|
|
17
|
+
extensions: []
|
|
18
|
+
extra_rdoc_files: []
|
|
19
|
+
files:
|
|
20
|
+
- "./model_gem_source/attr_limited_regex_accessor.rb"
|
|
21
|
+
- "./model_gem_source/controllers/create_student_controller.rb"
|
|
22
|
+
- "./model_gem_source/controllers/edit_student_controller.rb"
|
|
23
|
+
- "./model_gem_source/controllers/view_controller.rb"
|
|
24
|
+
- "./model_gem_source/data_construct_pattern/data_construct_pattarn.rb"
|
|
25
|
+
- "./model_gem_source/data_list.rb"
|
|
26
|
+
- "./model_gem_source/data_list_student_short.rb"
|
|
27
|
+
- "./model_gem_source/data_table.rb"
|
|
28
|
+
- "./model_gem_source/database/scripts/create_table.sql"
|
|
29
|
+
- "./model_gem_source/database/scripts/fill_data.sql"
|
|
30
|
+
- "./model_gem_source/database/students_db.rb"
|
|
31
|
+
- "./model_gem_source/database/students_list_db.rb"
|
|
32
|
+
- "./model_gem_source/student/abstract_student.rb"
|
|
33
|
+
- "./model_gem_source/student/student.rb"
|
|
34
|
+
- "./model_gem_source/student/student_short.rb"
|
|
35
|
+
- "./model_gem_source/student_list_format.rb"
|
|
36
|
+
- "./model_gem_source/students_list.rb"
|
|
37
|
+
- "./model_gem_source/students_list_adapter.rb"
|
|
38
|
+
- "./model_gem_source/students_list_format_strategy.rb"
|
|
39
|
+
- "./model_gem_source/students_tests.rb"
|
|
40
|
+
homepage: https://rubygems.org/gems/model_gem
|
|
41
|
+
licenses:
|
|
42
|
+
- MIT
|
|
43
|
+
metadata:
|
|
44
|
+
homepage_uri: https://rubygems.org/gems/model_gem
|
|
45
|
+
post_install_message:
|
|
46
|
+
rdoc_options: []
|
|
47
|
+
require_paths:
|
|
48
|
+
- lib
|
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 2.6.0
|
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
|
+
requirements:
|
|
56
|
+
- - ">="
|
|
57
|
+
- !ruby/object:Gem::Version
|
|
58
|
+
version: '0'
|
|
59
|
+
requirements: []
|
|
60
|
+
rubygems_version: 3.4.10
|
|
61
|
+
signing_key:
|
|
62
|
+
specification_version: 4
|
|
63
|
+
summary: Гем с модельками и контроллерами
|
|
64
|
+
test_files: []
|