rubbish_code 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b4b21965f0130ca61a48365f3da378ad726bf29a211ee6d2327cc825e0eb8449
4
+ data.tar.gz: b19d9d9517f6a90fa30f7ac0e0426e71d34a0a3d80e29e59e1105f439884fb70
5
+ SHA512:
6
+ metadata.gz: eb08de61aa853a490678f922b6ef29ccbf30af3e00f3f9cd3a50ab98db4feae77b0a2f99f5301601712dd7f13112d1b9fb5c1fe6b6abf50148c8d006c435c8ee
7
+ data.tar.gz: b6e3c9963cc335cb5b957c7fbda8ce9e80d639b6021016b607a1a179131a2dfc5732217d1818879f24f7e41477846db7e5c573f5d2fa1923110bb8e34a2b39ab
data/LICENSE.txt ADDED
@@ -0,0 +1,37 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 NullExp
4
+
5
+ Класс TabStudentsController представляет собой контроллер для работы с интерфейсом взаимодействия с объектами типа Student.
6
+
7
+ Методы класса:
8
+
9
+ 1. initialize(view) - конструктор класса, принимает объект представления (view) и создает пустой объект типа
10
+ DataListStudentShort, которому присваивается метод add_listener с аргументом view, в результате чего представление
11
+ устанавливается в качестве слушателя событий изменения состояния данных (data_list).
12
+ 2. on_view_created - метод, инициализирующий объект типа StudentRepository, который используется для взаимодействия
13
+ с базой данных, и при возникновении ошибки подключения к базе выводит диалоговое окно с сообщением об ошибке.
14
+ 3. show_view - метод, отображающий основное окно приложения.
15
+ 4. show_modal_add - метод, отображающий модальное окно для создания новой записи о студенте.
16
+ Создает экземпляр контроллера StudentInputFormControllerCreate и передает ему ссылку на текущий контроллер,
17
+ создает объект типа StudentInputForm и передает ему ссылку на контроллер. После чего отображает модальное окно.
18
+ 5. show_modal_edit(current_page, per_page, selected_row) - метод, отображающий модальное окно для
19
+ редактирования записи о студенте. Принимает значения текущей страницы (current_page), количества записей на странице
20
+ (per_page) и выбранной строки (selected_row). Вычисляет номер выбранного студента и выбирает его id из
21
+ объекта DataListStudentShort, после чего передает его в контроллер StudentInputFormControllerEdit, создает объект типа
22
+ StudentInputForm и передает ему ссылку на контроллер. После чего отображает модальное окно.
23
+ 6. delete_selected(current_page, per_page, selected_row) - метод, удаляющий выбранную запись о студенте.
24
+ Принимает значения текущей страницы (current_page), количества записей на странице (per_page)
25
+ и выбранной строки (selected_row). Вычисляет номер выбранного студента и выбирает его id из объекта DataListStudentShort,
26
+ после чего удаляет запись с помощью метода remove_student из объекта типа StudentRepository.
27
+ 7. refresh_data(page, per_page) - метод, обновляющий данные в списке студентов. Принимает значения
28
+ текущей страницы (page) и количества записей на странице (per_page).
29
+ Вызывает метод типа StudentRepository paginated_short_students для получения данных в формате объекта DataListStudentShort.
30
+ Обновляет информацию о количестве студентов с помощью метода update_student_count представления.
31
+
32
+ Контроллер Student_Input_Form_Controller_Edit и Student_Input_Form_Controller_Create представляют собой формы
33
+ для изменения и создания студентов в базу данных, соотвественно.
34
+
35
+ Модели student, student_base и student_short представляет собой модель студента с различными полями и методами
36
+ для установки, получения и обработки информации. Student_base - супер класс,
37
+ а student_short - короктая информация о студенте.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ ![9bm](https://user-images.githubusercontent.com/96076243/218162066-5df24062-497f-4d8b-a9b2-5612afd68f07.gif)
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'win32api'
4
+
5
+ class StudentInputFormControllerCreate
6
+ def initialize(parent_controller)
7
+ @parent_controller = parent_controller
8
+ end
9
+
10
+ def set_view(view)
11
+ @view = view
12
+ end
13
+
14
+ def on_view_created
15
+ begin
16
+ @student_rep = StudentRepository.new(DBSourceAdapter.new)
17
+ rescue Mysql2::Error::ConnectionError
18
+ on_db_conn_error
19
+ end
20
+ end
21
+
22
+ def process_fields(fields)
23
+ begin
24
+ last_name = fields.delete(:last_name)
25
+ first_name = fields.delete(:first_name)
26
+ father_name = fields.delete(:father_name)
27
+
28
+ return if last_name.nil? || first_name.nil? || father_name.nil?
29
+
30
+ student = Student.new(last_name, first_name, father_name, **fields)
31
+
32
+ @student_rep.add_student(student)
33
+
34
+ @view.close
35
+ rescue ArgumentError => e
36
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
37
+ api.call(0, e.message, 'Error', 0)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def on_db_conn_error
44
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
45
+ api.call(0, "No connection to DB говно", "Error", 0)
46
+ @view.close
47
+ end
48
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'win32api'
4
+
5
+ class StudentInputFormControllerEdit
6
+ def initialize(parent_controller, existing_student_id)
7
+ @parent_controller = parent_controller
8
+ @existing_student_id = existing_student_id
9
+ end
10
+
11
+ def set_view(view)
12
+ @view = view
13
+ end
14
+
15
+ def on_view_created
16
+ begin
17
+ @student_rep = StudentRepository.new(DBSourceAdapter.new)
18
+ rescue Mysql2::Error::ConnectionError
19
+ on_db_conn_error
20
+ end
21
+ @existing_student = @student_rep.student_by_id(@existing_student_id)
22
+ #@view.make_readonly(:git, :telegram, :email, :phone)
23
+ populate_fields(@existing_student)
24
+ end
25
+
26
+ def populate_fields(student)
27
+ @view.set_value(:last_name, student.last_name)
28
+ @view.set_value(:first_name, student.first_name)
29
+ @view.set_value(:father_name, student.father_name)
30
+ @view.set_value(:git, student.git)
31
+ @view.set_value(:telegram, student.telegram)
32
+ @view.set_value(:email, student.email)
33
+ @view.set_value(:phone, student.phone)
34
+ end
35
+
36
+ def process_fields(fields)
37
+ begin
38
+ new_student = Student.from_hash(fields)
39
+
40
+ @student_rep.replace_student(@existing_student_id, new_student)
41
+
42
+ @view.close
43
+ rescue ArgumentError => e
44
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
45
+ api.call(0, e.message, 'Error', 0)
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ def on_db_conn_error
52
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
53
+ api.call(0, "No connection to DB", "Error", 0)
54
+ @view.close
55
+ end
56
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './LabStudents/views/main_window'
4
+ require './LabStudents/repositories/student_repository'
5
+ require './LabStudents/repositories/adapters/db_source_adapter'
6
+ require './LabStudents/repositories/containers/data_list_student_short'
7
+ require './LabStudents/views/student_input_form'
8
+ require './LabStudents/controllers/student_input_form/student_input_form_controller_create'
9
+ require './LabStudents/controllers/student_input_form/student_input_form_controller_edit'
10
+ require 'win32api'
11
+
12
+ class TabStudentsController
13
+ def initialize(view)
14
+ @view = view
15
+ @data_list = DataListStudentShort.new([])
16
+ @data_list.add_listener(@view)
17
+ end
18
+
19
+ def on_view_created
20
+ #begin
21
+ @student_rep = StudentRepository.new(DBSourceAdapter.new)
22
+ # rescue Mysql2::Error::ConnectionError
23
+ # on_db_conn_error
24
+ # end
25
+ end
26
+
27
+ def show_view
28
+ @view.create.show
29
+ end
30
+
31
+ def show_modal_add
32
+ controller = StudentInputFormControllerCreate.new(self)
33
+ view = StudentInputForm.new(controller)
34
+ controller.set_view(view)
35
+ view.create.show
36
+ end
37
+
38
+ def show_modal_edit(current_page, per_page, selected_row)
39
+ student_num = (current_page - 1) * per_page + selected_row
40
+ @data_list.select_element(student_num)
41
+ student_id = @data_list.selected_id
42
+ controller = StudentInputFormControllerEdit.new(self, student_id)
43
+ view = StudentInputForm.new(controller)
44
+ controller.set_view(view)
45
+ view.create.show
46
+ end
47
+
48
+ def delete_selected(current_page, per_page, selected_row)
49
+ #begin
50
+ student_num = (current_page - 1) * per_page + selected_row
51
+ @data_list.select_element(student_num)
52
+ student_id = @data_list.selected_id
53
+ @student_rep.remove_student(student_id)
54
+ # rescue
55
+ # on_db_conn_error
56
+ # end
57
+ end
58
+
59
+ def refresh_data(page, per_page)
60
+ #begin
61
+ @data_list = @student_rep.paginated_short_students(page, per_page, @data_list)
62
+ @view.update_student_count(@student_rep.student_count)
63
+ # rescue
64
+ # on_db_conn_error
65
+ # end
66
+ end
67
+
68
+ private
69
+
70
+ def on_db_conn_error
71
+ # api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
72
+ # api.call(0, "No connection to DB =)", "Error", 0)
73
+ # exit(false)
74
+ end
75
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require_relative 'student_base'
5
+
6
+ class Student < StudentBase
7
+ # Делаем new предка публичным
8
+ public_class_method :new
9
+
10
+ def self.from_hash(hash)
11
+ hash = hash.dup
12
+ raise ArgumentError, 'Fields required: fist_name, last_name, father_name' unless hash.key?(:first_name) && hash.key?(:last_name) && hash.key?(:father_name)
13
+
14
+ first_name = hash.delete(:first_name)
15
+ last_name = hash.delete(:last_name)
16
+ father_name = hash.delete(:father_name)
17
+
18
+ Student.new(last_name, first_name, father_name, **hash)
19
+ end
20
+
21
+ # Конструктор из JSON строки
22
+ def self.from_json_str(str)
23
+ params = JSON.parse(str, { symbolize_names: true })
24
+ from_hash(params)
25
+ end
26
+
27
+ # Делаем публичными геттеры и сеттеры базового класса
28
+ public :phone, :telegram, :email, 'id=', 'phone=', 'telegram=', 'email=', 'git='
29
+
30
+ # Стандартные геттеры для полей
31
+ attr_reader :last_name, :first_name, :father_name
32
+
33
+ # Стандартный конструктор
34
+ def initialize(last_name, first_name, father_name, **options)
35
+ self.last_name = last_name
36
+ self.first_name = first_name
37
+ self.father_name = father_name
38
+ super(**options)
39
+ end
40
+
41
+ # Сеттеры с валидацией перед присваиванием
42
+ def last_name=(new_last_name)
43
+ raise ArgumentError, "Invalid argument: last_name=#{new_last_name}" unless Student.valid_name?(new_last_name)
44
+
45
+ @last_name = new_last_name
46
+ end
47
+
48
+ def first_name=(new_first_name)
49
+ raise ArgumentError, "Invalid argument: first_name=#{new_first_name}" unless Student.valid_name?(new_first_name)
50
+
51
+ @first_name = new_first_name
52
+ end
53
+
54
+ def father_name=(new_father_name)
55
+ raise ArgumentError, "Invalid argument: father_name=#{new_father_name}" unless Student.valid_name?(new_father_name)
56
+
57
+ @father_name = new_father_name
58
+ end
59
+
60
+ # Отдельный сеттер для массовой установки контактов
61
+ def set_contacts(phone: nil, telegram: nil, email: nil)
62
+ self.phone = phone if phone
63
+ self.telegram = telegram if telegram
64
+ self.email = email if email
65
+ end
66
+
67
+ # Имя пользователя в формате Фамилия И. О.
68
+ def last_name_and_initials
69
+ "#{last_name} #{first_name[0]}. #{father_name[0]}."
70
+ end
71
+
72
+ # Краткая информация о пользователе
73
+ def short_info
74
+ info = {}
75
+ info[:last_name_and_initials] = last_name_and_initials
76
+ info[:contact] = short_contact
77
+ info[:git] = git
78
+ JSON.generate(info)
79
+ end
80
+
81
+ # Методы приведения объекта к строке
82
+ def to_s
83
+ result = "#{last_name} #{first_name} #{father_name}"
84
+ %i[id phone telegram email git].each do |attr|
85
+ attr_val = send(attr)
86
+ result += ", #{attr}=#{attr_val}" unless attr_val.nil?
87
+ end
88
+ result
89
+ end
90
+
91
+ def to_hash
92
+ attrs = {}
93
+ %i[last_name first_name father_name id phone telegram email git].each do |attr|
94
+ attr_val = send(attr)
95
+ attrs[attr] = attr_val unless attr_val.nil?
96
+ end
97
+ attrs
98
+ end
99
+
100
+ def to_json_str
101
+ JSON.generate(to_hash)
102
+ end
103
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ class StudentBase
4
+ # Запрещаем создание базового класса (он "абстрактный")
5
+ private_class_method :new
6
+
7
+ # Валидаторы для полей
8
+ def self.valid_name?(name)
9
+ name.match(/(^[А-Я][а-я]+$)|(^[A-Z][a-z]+$)/)
10
+ end
11
+
12
+ def self.valid_phone?(phone)
13
+ phone.match(/^\+?[78] ?[(-]?\d{3} ?[)-]?[ -]?\d{3}[ -]?\d{2}[ -]?\d{2}$/)
14
+ end
15
+
16
+ def self.valid_profile_name?(profile_name)
17
+ profile_name.match(/^[a-zA-Z0-9_.]+$/)
18
+ end
19
+
20
+ def self.valid_email?(email)
21
+ email.match(/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/)
22
+ end
23
+
24
+ # Стандартные геттеры и сеттеры для полей
25
+
26
+ protected
27
+
28
+ attr_writer :id
29
+ attr_reader :phone, :telegram, :email
30
+
31
+ public
32
+
33
+ attr_reader :id, :git
34
+
35
+ # Стандартный конструктор
36
+ def initialize(id: nil, phone: nil, telegram: nil, email: nil, git: nil)
37
+ self.id = id
38
+ self.phone = phone
39
+ self.telegram = telegram
40
+ self.email = email
41
+ self.git = git
42
+ end
43
+
44
+ # Краткая информация о первом доступном контакте пользователя
45
+ def short_contact
46
+ contact = {}
47
+ %i[telegram email phone].each do |attr|
48
+ attr_val = send(attr)
49
+ next if attr_val.nil?
50
+
51
+ contact[:type] = attr
52
+ contact[:value] = attr_val
53
+ return contact
54
+ end
55
+
56
+ nil
57
+ end
58
+
59
+ protected
60
+
61
+ # Сеттеры с валидацией перед присваиванием
62
+ def phone=(new_phone)
63
+ raise ArgumentError, "Invalid argument: phone=#{new_phone}" unless new_phone.nil? || StudentBase.valid_phone?(new_phone)
64
+
65
+ @phone = new_phone
66
+ end
67
+
68
+ def telegram=(new_telegram)
69
+ raise ArgumentError, "Invalid argument: telegram=#{new_telegram}" unless new_telegram.nil? || StudentBase.valid_profile_name?(new_telegram)
70
+
71
+ @telegram = new_telegram
72
+ end
73
+
74
+ def git=(new_git)
75
+ raise ArgumentError, "Invalid argument: git=#{new_git}" unless new_git.nil? || StudentBase.valid_profile_name?(new_git)
76
+
77
+ @git = new_git
78
+ end
79
+
80
+ def email=(new_email)
81
+ raise ArgumentError, "Invalid argument: email=#{new_email}" unless new_email.nil? || StudentBase.valid_email?(new_email)
82
+
83
+ @email = new_email
84
+ end
85
+
86
+ public
87
+
88
+ # Валидаторы объекта
89
+ def has_contacts?
90
+ !phone.nil? || !telegram.nil? || !email.nil?
91
+ end
92
+
93
+ def has_git?
94
+ !git.nil?
95
+ end
96
+
97
+ def valid?
98
+ has_contacts? && has_git?
99
+ end
100
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ class StudentShort < StudentBase
4
+ # Делаем new предка публичным
5
+ public_class_method :new
6
+
7
+ # Стандартные геттеры и сеттеры
8
+
9
+ private
10
+
11
+ attr_writer :last_name_and_initials, :contact
12
+
13
+ public
14
+
15
+ attr_reader :last_name_and_initials, :contact
16
+
17
+ # Конструктор из Student
18
+ def self.from_student(student)
19
+ raise ArgumentError, 'Student ID is required' if student.id.nil?
20
+
21
+ StudentShort.new(student.id, student.short_info)
22
+ end
23
+
24
+ # Стандартный конструктор
25
+ def initialize(id, info_str)
26
+ params = JSON.parse(info_str, { symbolize_names: true })
27
+ raise ArgumentError, 'Fields required: last_name_and_initials' if !params.key?(:last_name_and_initials) || params[:last_name_and_initials].nil?
28
+
29
+ self.id = id
30
+ self.last_name_and_initials = params[:last_name_and_initials]
31
+ self.contact = params[:contact]
32
+ self.git = params[:git]
33
+
34
+ options = {}
35
+ options[:id] = id
36
+ options[:git] = git
37
+ options[contact[:type].to_sym] = contact[:value] if contact
38
+ super(**options)
39
+ end
40
+
41
+ # Методы приведения объекта к строке
42
+ def to_s
43
+ result = last_name_and_initials
44
+ %i[id contact git].each do |attr|
45
+ attr_val = send(attr)
46
+ result += ", #{attr}=#{attr_val}" unless attr_val.nil?
47
+ end
48
+ result
49
+ end
50
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubbish_code
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jake Epps
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-05-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: win32api
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: А gem that allows you to get pass for patterns
28
+ email: nullexp.team@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - LICENSE.txt
34
+ - README.md
35
+ - lib/controllers/student_input_form/student_input_form_controller_create.rb
36
+ - lib/controllers/student_input_form/student_input_form_controller_edit.rb
37
+ - lib/controllers/tab_students_controller.rb
38
+ - lib/models/student.rb
39
+ - lib/models/student_base.rb
40
+ - lib/models/student_short.rb
41
+ homepage: https://github.com/Jakepps/Ruby_Moment
42
+ licenses:
43
+ - MIT
44
+ metadata: {}
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: '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: Student App
64
+ test_files: []