my_students 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. checksums.yaml +7 -0
  2. data/lib/my_students/version.rb +5 -0
  3. data/lib/my_students.rb +10 -0
  4. data/lib/source/controllers/student_contact_form_controller.rb +40 -0
  5. data/lib/source/controllers/student_create_form_controller.rb +48 -0
  6. data/lib/source/controllers/student_edit_form_controller.rb +45 -0
  7. data/lib/source/controllers/student_git_form_controller.rb +40 -0
  8. data/lib/source/controllers/student_list_controller.rb +112 -0
  9. data/lib/source/gui/logic_window.rb +187 -0
  10. data/lib/source/gui/main_window.rb +26 -0
  11. data/lib/source/gui/student_create_form.rb +70 -0
  12. data/lib/source/gui/test.rb +32 -0
  13. data/lib/source/logger/logger_holder.rb +23 -0
  14. data/lib/source/models/student.rb +163 -0
  15. data/lib/source/models/student_short.rb +56 -0
  16. data/lib/source/repositories/containers/data_list.rb +67 -0
  17. data/lib/source/repositories/containers/data_list_student_short.rb +18 -0
  18. data/lib/source/repositories/containers/data_table.rb +38 -0
  19. data/lib/source/repositories/data_sources/strategy/student_list_json.rb +16 -0
  20. data/lib/source/repositories/data_sources/strategy/student_list_txt.rb +39 -0
  21. data/lib/source/repositories/data_sources/strategy/student_list_yaml.rb +17 -0
  22. data/lib/source/repositories/data_sources/student_list_base.rb +91 -0
  23. data/lib/source/repositories/data_sources/student_list_strategy.rb +12 -0
  24. data/lib/source/repositories/db_university.rb +28 -0
  25. data/lib/source/repositories/student_list.rb +40 -0
  26. data/lib/source/repositories/student_list_db_adapter.rb +75 -0
  27. data/lib/source/repositories/student_list_file_adapter.rb +42 -0
  28. data/my_students.gemspec +17 -0
  29. data/sig/my_students.rbs +4 -0
  30. metadata +85 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: aa63632f6f00b17c12e1713c15457ee77bae2b4584f809388767b03122a95c9e
4
+ data.tar.gz: '09280c3129b0a11974388b772d18c38d561137eff9f791191b9b46ac86c96f03'
5
+ SHA512:
6
+ metadata.gz: eeface5fc6af33d66668a0d9d53f76ba75ff90951223029edca841423e8196880a65d50a6cd21370a6d8a251aa2f9206e2f24c2e597493070aa9746428f64cc9
7
+ data.tar.gz: cafe7c5535f6dcbc2049f1893c9dcf66c5d0cf7ee52006669a943dee49158cd5d57e09de7da67ce70cd02eca3566357d7c06e617aaf39b582bcfce940afcc76b
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MyStudents
4
+ VERSION = "1.0.1"
5
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "my_students/version"
4
+
5
+ module MyStudents
6
+ Dir[File.dirname(__FILE__) + '/source/**/*.rb'].each { |file|
7
+ puts file
8
+ require file
9
+ }
10
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ class StudentContactFormController
4
+ def initialize(parent_controller, existing_student_id)
5
+ @parent_controller = parent_controller
6
+ @existing_student_id = existing_student_id
7
+ end
8
+
9
+ def view=(view)
10
+ @view = view
11
+ end
12
+
13
+ def on_view_created
14
+ @student_list = StudentList.new(StudentListDbAdapter.new)
15
+ @existing_student = @student_list.student_by_id(@existing_student_id)
16
+ @view.make_readonly(:first_name,:last_name,:paternal_name, :git)
17
+ set_fields(@existing_student)
18
+ end
19
+
20
+ def set_fields(student)
21
+ student = student
22
+ puts student
23
+ @view.set_value(:last_name, student.last_name)
24
+ @view.set_value(:first_name, student.first_name)
25
+ @view.set_value(:paternal_name, student.paternal_name)
26
+ @view.set_value(:git, student.git)
27
+ @view.set_value(:telegram, student.telegram)
28
+ @view.set_value(:email, student.email)
29
+ @view.set_value(:phone, student.phone)
30
+ end
31
+
32
+
33
+ def process_fields(fields)
34
+ new_student = Student.from_hash(fields)
35
+
36
+ @student_list.replace_student(@existing_student_id, new_student)
37
+
38
+ @view.close
39
+ end
40
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ require 'sqlite3'
3
+ require_relative '../logger/logger_holder'
4
+ require_relative '../repositories/student_list'
5
+ require_relative '../repositories/student_list_db_adapter'
6
+ class StudentCreateFormController
7
+ def initialize(controller)
8
+ @controller = controller
9
+ LoggerHolder.instance.debug('StudentCreateFormController: initialized')
10
+ end
11
+
12
+ def on_view_created
13
+ begin
14
+ @student_rep = StudentList.new(StudentListDbAdapter.new)
15
+ rescue SQLException::SQLException => e
16
+ on_db_conn_error(e)
17
+ end
18
+ end
19
+
20
+ def view=(view)
21
+ @view = view
22
+ LoggerHolder.instance.debug('StudentCreateFormController: setter view')
23
+ end
24
+
25
+ def process_fields(fields)
26
+ last_name = fields.delete(:last_name)
27
+ first_name = fields.delete(:first_name)
28
+ paternal_name = fields.delete(:paternal_name)
29
+
30
+ # TODO написать пользователю что он не прав
31
+ return if last_name.nil? || first_name.nil? || paternal_name.nil?
32
+
33
+ student = Student.new(last_name, first_name, paternal_name, **fields)
34
+
35
+ @student_rep.add_student(student)
36
+ @view.close
37
+ @controller.view.refresh_current_page
38
+ LoggerHolder.instance.debug('StudentCreateFormController: add student')
39
+ end
40
+
41
+ def on_db_conn_error(e)
42
+ LoggerHolder.instance.debug('StudentCreateFormController: DB connection error:')
43
+ LoggerHolder.instance.error(error.message)
44
+ script = "display dialog \"Отсутсвует подключение к БД #{e.message}\" with title \"Ошибка\""
45
+ system 'osascript', '-e', script
46
+ exit(false)
47
+ end
48
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../logger/logger_holder'
3
+ class StudentEditFormController
4
+ def initialize(parent_controller, existing_student_id)
5
+ @parent_controller = parent_controller
6
+ @existing_student_id = existing_student_id
7
+ LoggerHolder.instance.debug('StudentEditFormController: initialized')
8
+ end
9
+
10
+ def view=(view)
11
+ @view = view
12
+ LoggerHolder.instance.debug('StudentEditFormController: view')
13
+ end
14
+
15
+ def on_view_created
16
+ @student_list = StudentList.new(StudentListDbAdapter.new)
17
+ @existing_student = @student_list.student_by_id(@existing_student_id)
18
+ @view.make_readonly(:git, :telegram, :email, :phone)
19
+ set_fields(@existing_student)
20
+ end
21
+
22
+ def set_fields(student)
23
+ student = student
24
+ puts student
25
+ @view.set_value(:last_name, student.last_name)
26
+ @view.set_value(:first_name, student.first_name)
27
+ @view.set_value(:paternal_name, student.paternal_name)
28
+ @view.set_value(:git, student.git)
29
+ @view.set_value(:telegram, student.telegram)
30
+ @view.set_value(:email, student.email)
31
+ @view.set_value(:phone, student.phone)
32
+ end
33
+
34
+
35
+ def process_fields(fields)
36
+ new_student = Student.from_hash(fields)
37
+
38
+ LoggerHolder.instance.debug('StudentEditFormController: replace student')
39
+
40
+ @student_list.replace_student(@existing_student_id, new_student)
41
+
42
+
43
+ @view.close
44
+ end
45
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ class StudentGitFormController
4
+ def initialize(parent_controller, existing_student_id)
5
+ @parent_controller = parent_controller
6
+ @existing_student_id = existing_student_id
7
+ end
8
+
9
+ def view=(view)
10
+ @view = view
11
+ end
12
+
13
+ def on_view_created
14
+ @student_list = StudentList.new(StudentListDbAdapter.new)
15
+ @existing_student = @student_list.student_by_id(@existing_student_id)
16
+ @view.make_readonly(:first_name,:last_name,:paternal_name, :telegram, :email, :phone)
17
+ set_fields(@existing_student)
18
+ end
19
+
20
+ def set_fields(student)
21
+ student = student
22
+ puts student
23
+ @view.set_value(:last_name, student.last_name)
24
+ @view.set_value(:first_name, student.first_name)
25
+ @view.set_value(:paternal_name, student.paternal_name)
26
+ @view.set_value(:git, student.git)
27
+ @view.set_value(:telegram, student.telegram)
28
+ @view.set_value(:email, student.email)
29
+ @view.set_value(:phone, student.phone)
30
+ end
31
+
32
+
33
+ def process_fields(fields)
34
+ new_student = Student.from_hash(fields)
35
+
36
+ @student_list.replace_student(@existing_student_id, new_student)
37
+
38
+ @view.close
39
+ end
40
+ end
@@ -0,0 +1,112 @@
1
+
2
+ require_relative '../gui/main_window'
3
+ require_relative '../gui/logic_window'
4
+ require_relative '../repositories/student_list'
5
+ require_relative '../repositories/student_list_db_adapter'
6
+ require_relative '../repositories/student_list_file_adapter'
7
+ require_relative '../repositories/data_sources/strategy/student_list_json'
8
+ require_relative '../repositories/containers/data_list_student_short'
9
+ require_relative 'student_create_form_controller'
10
+ require_relative 'student_edit_form_controller'
11
+ require_relative 'student_git_form_controller'
12
+ require_relative 'student_contact_form_controller'
13
+ require_relative '../logger/logger_holder'
14
+ require 'glimmer-dsl-libui'
15
+
16
+ class StudentListController
17
+
18
+ attr_reader :view
19
+ def initialize(view)
20
+ LoggerHolder.instance.debug('StudentListController: init start')
21
+ @view = view
22
+ @data_list = DataListStudentShort.new([])
23
+ @data_list.add_observer(@view)
24
+ LoggerHolder.instance.debug('StudentListController: init done')
25
+ end
26
+
27
+ def on_view_created
28
+ #@student_list = StudentList.new(StudentListFileAdapter.new(StudentListJSON.new, './LabStudents/test_data/students.json'))
29
+
30
+ begin
31
+ @student_list=StudentList.new(StudentListDbAdapter.new)
32
+ LoggerHolder.instance.debug('StudentListController: view create')
33
+ rescue
34
+ on_db_conn_error
35
+ end
36
+ end
37
+
38
+
39
+ def show_view
40
+ @view.create.show
41
+ end
42
+
43
+ def show_add_student()
44
+ LoggerHolder.instance.debug('StudentListController: show add student')
45
+ controller = StudentCreateFormController.new(self)
46
+ view = StudentCreateForm.new(controller)
47
+ controller.view=view
48
+ view.create.show
49
+ end
50
+
51
+ def show_edit_student(current_page, per_page, selected_row)
52
+ LoggerHolder.instance.debug('StudentListController: show edit name')
53
+ student_num = selected_row
54
+ @data_list.select_elem(student_num)
55
+ student_id = @data_list.selected_id
56
+ controller = StudentEditFormController.new(self, student_id)
57
+ view = StudentCreateForm.new(controller)
58
+ controller.view=view
59
+ view.create.show
60
+ end
61
+
62
+ def show_git_student(current_page, per_page, selected_row)
63
+ LoggerHolder.instance.debug('StudentListController: show edit git')
64
+ student_num = selected_row
65
+ @data_list.select_elem(student_num)
66
+ student_id = @data_list.selected_id
67
+ controller = StudentGitFormController.new(self, student_id)
68
+ view = StudentCreateForm.new(controller)
69
+ controller.view=view
70
+ view.create.show
71
+ end
72
+
73
+ def show_contact_student(current_page, per_page, selected_row)
74
+ LoggerHolder.instance.debug('StudentListController: show edit git')
75
+ student_num = selected_row
76
+ @data_list.select_elem(student_num)
77
+ student_id = @data_list.selected_id
78
+ controller = StudentContactFormController.new(self, student_id)
79
+ view = StudentCreateForm.new(controller)
80
+ controller.view=view
81
+ view.create.show
82
+ end
83
+
84
+ def delete_selected(current_page, per_page, selected_row)
85
+ # begin
86
+ #student_num = (current_page - 1) * per_page + selected_row
87
+ student_num = selected_row
88
+ puts student_num
89
+ @data_list.select_elem(student_num)
90
+ student_id = @data_list.selected_id
91
+ @student_list.remove_student(student_id)
92
+ # rescue
93
+ # on_db_conn_error
94
+ # end
95
+ end
96
+ def refresh_data(k, n)
97
+ # begin
98
+ #raise StandardError, "Error DB"
99
+ @data_list = @student_list.k_n_student_short_list(k, n, @data_list)
100
+ @view.update_student_count(@student_list.student_count)
101
+ # rescue
102
+ # on_db_conn_error
103
+ # end
104
+ end
105
+
106
+ # разрыв соединения с бд
107
+ def on_db_conn_error
108
+ script = 'display dialog "Отсутсвует подключение к БД" with title "Ошибка"'
109
+ system 'osascript', '-e', script
110
+ exit(false)
111
+ end
112
+ end
@@ -0,0 +1,187 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../controllers/student_list_controller'
3
+ require_relative '../repositories/containers/data_table'
4
+ require_relative 'student_create_form'
5
+ class LogicWindow
6
+ include Glimmer
7
+
8
+ STUDENTS_PER_PAGE = 10
9
+
10
+ def initialize
11
+ @controller = StudentListController.new(self)
12
+ @current_page = 1
13
+ @total_count = 0
14
+ end
15
+
16
+ def on_create
17
+ @controller.on_view_created
18
+ @controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
19
+ end
20
+
21
+ # Метод наблюдателя datalist
22
+ def on_datalist_changed(new_table)
23
+ arr = new_table.to_my_array
24
+ arr.map do |row|
25
+ row[3] = row[3][:value] unless row[3].nil?
26
+ end
27
+ @table.model_array = arr
28
+ end
29
+
30
+ def update_student_count(new_cnt)
31
+ @total_count = new_cnt
32
+ @page_label.text = "#{@current_page} / #{(@total_count / STUDENTS_PER_PAGE.to_f).ceil}"
33
+ end
34
+
35
+ def create
36
+ root_container = horizontal_box {
37
+
38
+ # 1 область
39
+ vertical_box {
40
+ form {
41
+ stretchy false
42
+
43
+ @filter_last_name_initials = entry {
44
+ stretchy false
45
+ label 'Фамилия И. О.'
46
+ }
47
+
48
+ @filters = {}
49
+ fields = [[:git, 'Гит'], [:email, 'Почта'], [:phone, 'Телефон'], [:telegram, 'Телеграм']]
50
+
51
+ fields.each do |field|
52
+ @filters[field[0]] = {}
53
+
54
+ @filters[field[0]][:combobox] = combobox {
55
+ stretchy false
56
+ label "#{field[1]} имеется?"
57
+ items ['Не важно', 'Да', 'Нет']
58
+ selected 0
59
+
60
+ on_selected do
61
+ if @filters[field[0]][:combobox].selected == 1
62
+ @filters[field[0]][:entry].read_only = false
63
+ else
64
+ @filters[field[0]][:entry].text = ''
65
+ @filters[field[0]][:entry].read_only = true
66
+ end
67
+ end
68
+ }
69
+
70
+ @filters[field[0]][:entry] = entry {
71
+ stretchy false
72
+ label field[1]
73
+ read_only true
74
+ }
75
+ end
76
+ }
77
+ }
78
+
79
+ #2 область
80
+ vertical_box {
81
+ stretchy false
82
+ @table = refined_table(
83
+ table_editable: false,
84
+ filter: lambda do |row_hash, query|
85
+ utf8_query = query.force_encoding("utf-8")
86
+ row_hash['Фамилия И. О'].include?(utf8_query)
87
+ end,
88
+ table_columns: {
89
+ '#' => :text,
90
+ 'Фамилия И. О' => :text,
91
+ 'Гит' => :text,
92
+ 'Контакт' => :text
93
+ },
94
+ )
95
+
96
+ @pages = horizontal_box {
97
+ stretchy false
98
+
99
+ button("<") {
100
+ stretchy true
101
+
102
+ on_clicked do
103
+ @current_page = [@current_page - 1, 1].max
104
+ @controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
105
+ end
106
+
107
+ }
108
+ @page_label = label("...") { stretchy false }
109
+ button(">") {
110
+ stretchy true
111
+
112
+ on_clicked do
113
+ @current_page = [@current_page + 1, (@total_count / STUDENTS_PER_PAGE.to_f).ceil].min
114
+ @controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
115
+ end
116
+ }
117
+ }
118
+ }
119
+
120
+ #3 область
121
+ vertical_box {
122
+ stretchy false
123
+
124
+ button('Добавить') {
125
+ stretchy false
126
+
127
+ on_clicked {
128
+ @controller.show_add_student
129
+
130
+ }
131
+
132
+ }
133
+ button('Изменить ФИО') {
134
+ stretchy false
135
+
136
+ on_clicked {
137
+ @controller.show_edit_student(@current_page, STUDENTS_PER_PAGE, @table.selection) unless @table.selection.nil?
138
+ } }
139
+ button('Изменить git') { stretchy false
140
+ on_clicked{
141
+ @controller.show_git_student(@current_page, STUDENTS_PER_PAGE, @table.selection) unless @table.selection.nil?
142
+ }
143
+ }
144
+ button('Изменить контакт') { stretchy false
145
+ on_clicked{
146
+ @controller.show_contact_student(@current_page, STUDENTS_PER_PAGE, @table.selection) unless @table.selection.nil?
147
+ }
148
+ }
149
+ button('Удалить') {
150
+ stretchy false
151
+
152
+ on_clicked {
153
+ @controller.delete_selected(@current_page, STUDENTS_PER_PAGE, @table.selection) unless @table.selection.nil?
154
+ @controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
155
+ }
156
+ }
157
+ button('Обновить') {
158
+ stretchy false
159
+
160
+ on_clicked {
161
+ @controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
162
+ }
163
+ }
164
+ }
165
+ }
166
+ on_create
167
+ root_container
168
+ end
169
+ def refresh_current_page
170
+ @controller.refresh_data(@current_page, STUDENTS_PER_PAGE)
171
+ end
172
+
173
+ private
174
+
175
+ def sort_by_column(column_index)
176
+ data = @table.cell_rows
177
+ if @sort_column == column_index
178
+ data.reverse!
179
+ @sort_order = (@sort_order == :asc) ? :desc : :asc
180
+ else
181
+ @sort_column = column_index
182
+ @sort_order = :asc
183
+ data.sort_by! { |row| row[column_index].to_s }
184
+ end
185
+ @table.cell_rows = data
186
+ end
187
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+ require_relative 'logic_window'
5
+
6
+ class MainWindow
7
+ include Glimmer
8
+
9
+ def initialize
10
+ @logic_tab = LogicWindow.new
11
+ end
12
+ def create
13
+ window('Универ', 1200, 700) {
14
+ margined true
15
+ tab {
16
+ tab_item('Студенты') {
17
+
18
+ @logic_tab.create
19
+ }
20
+
21
+ tab_item('Вкладка 2') { }
22
+ tab_item('Вкладка 3') { }
23
+ }
24
+ }
25
+ end
26
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+ require_relative '../controllers/student_create_form_controller'
5
+ require_relative '../models/student'
6
+
7
+ class StudentCreateForm
8
+ include Glimmer
9
+ puts "hello"
10
+
11
+ def initialize(controller, existing_student = nil)
12
+ @existing_student = existing_student.to_hash unless existing_student.nil?
13
+ @controller = controller
14
+ @entries = {}
15
+ end
16
+
17
+ def on_create
18
+ @controller.on_view_created
19
+ end
20
+
21
+ def create
22
+ @root_container = window('Универ', 300, 200) {
23
+
24
+
25
+ vertical_box {
26
+ @student_form = form {
27
+ stretchy false
28
+
29
+ fields = [[:last_name, 'Фамилия', false], [:first_name, 'Имя', false], [:paternal_name, 'Отчество', false], [:git, 'Гит', true], [:telegram, 'Телеграм', true], [:email, 'Почта', true], [:phone, 'Телефон', true]]
30
+
31
+ fields.each do |field|
32
+ @entries[field[0]] = entry {
33
+ label field[1]
34
+ }
35
+ end
36
+ }
37
+
38
+
39
+ button('Сохранить') {
40
+ stretchy false
41
+
42
+ on_clicked {
43
+ values = @entries.transform_values { |v| v.text.force_encoding("utf-8").strip }
44
+ values.transform_values! { |v| v.empty? ? nil : v}
45
+
46
+ @controller.process_fields(values)
47
+ }
48
+
49
+ }
50
+ }
51
+ }
52
+ on_create
53
+ @root_container
54
+ end
55
+
56
+ def set_value(field, value)
57
+ return unless @entries.include?(field)
58
+ @entries[field].text = value
59
+ end
60
+
61
+ def make_readonly(*fields)
62
+ fields.each do |field|
63
+ @entries[field].read_only = true
64
+ end
65
+ end
66
+
67
+ def close
68
+ @root_container.destroy
69
+ end
70
+ end
@@ -0,0 +1,32 @@
1
+ require 'glimmer-dsl-libui'
2
+
3
+ include Glimmer
4
+
5
+ data = [
6
+ ['task 1', 0],
7
+ ['task 2', 15],
8
+ ['task 3', 100],
9
+ ['task 4', 75],
10
+ ['task 5', -1],
11
+ ]
12
+
13
+ window('Task Progress', 300, 200) {
14
+ vertical_box {
15
+ table {
16
+ text_column('Task')
17
+ progress_bar_column('Progress')
18
+
19
+ cell_rows data
20
+ }
21
+
22
+ button('Mark All As Done') {
23
+ stretchy false
24
+
25
+ on_clicked do
26
+ data.each_with_index do |row_data, row|
27
+ data[row][1] = 100
28
+ end
29
+ end
30
+ }
31
+ }
32
+ }.show
@@ -0,0 +1,23 @@
1
+
2
+ require 'logger'
3
+
4
+ class LoggerHolder
5
+ private_class_method :new
6
+ @instance_mutex = Mutex.new
7
+
8
+ attr_reader :logger
9
+
10
+ def initialize
11
+ @logger = Logger.new(STDOUT)
12
+ end
13
+
14
+ def self.instance
15
+ return @instance.logger if @instance
16
+
17
+ @instance_mutex.synchronize do
18
+ @instance ||= new
19
+ end
20
+
21
+ @instance.logger
22
+ end
23
+ end