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 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,10 @@
1
+ require_relative './create_student_view.rb'
2
+
3
+ class CreateStudentController
4
+ attr_reader :ui
5
+ attr_accessor :onCreate
6
+
7
+ def initialize()
8
+ @ui = CreateStudentView.new(self, nil)
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class EditStudentController
2
+ attr_reader :ui
3
+ attr_accessor :onCreate
4
+ attr_reader :edit_user_id
5
+
6
+ def initialize(student)
7
+ @edit_user_id = student.id
8
+ @ui = CreateStudentView.new(self, student)
9
+ @ui.set_editing_mode()
10
+ end
11
+ 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,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,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: []