papaSquidLib 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +69 -0
- data/lib/controllers/tab_students_controller.rb +43 -0
- data/lib/data_sources/db_client.rb +35 -0
- data/lib/db_config/config.yaml +5 -0
- data/lib/db_config/library_config.yaml +5 -0
- data/lib/db_config/migrations/create_db.sql +3 -0
- data/lib/db_config/migrations/create_tables.sql +29 -0
- data/lib/db_config/mock_data/mock_data.sql +72 -0
- data/lib/logger.rb +27 -0
- data/lib/main.rb +6 -0
- data/lib/manager/controllers/manager_input_form_controller_create.rb +44 -0
- data/lib/manager/controllers/manager_input_form_controller_edit.rb +54 -0
- data/lib/manager/controllers/manager_list_controller.rb +99 -0
- data/lib/manager/manager_db_data_source.rb +63 -0
- data/lib/manager/ui/manager_input_form.rb +69 -0
- data/lib/manager/ui/manager_list_view.rb +168 -0
- data/lib/models/manager.rb +41 -0
- data/lib/models/student.rb +102 -0
- data/lib/models/student_base.rb +100 -0
- data/lib/models/student_short.rb +50 -0
- data/lib/models/task.rb +49 -0
- data/lib/models/user.rb +32 -0
- data/lib/papaSquidLib/version.rb +5 -0
- data/lib/papa_squid_lib.rb +6 -0
- data/lib/repositories/adapters/db_source_adapter.rb +54 -0
- data/lib/repositories/adapters/file_source_adapter.rb +37 -0
- data/lib/repositories/containers/data_list.rb +74 -0
- data/lib/repositories/containers/data_list_student_short.rb +18 -0
- data/lib/repositories/containers/data_table.rb +35 -0
- data/lib/repositories/data_sources/db_data_source.rb +32 -0
- data/lib/repositories/data_sources/file_data_source.rb +75 -0
- data/lib/repositories/data_sources/transformers/data_transformer_base.rb +15 -0
- data/lib/repositories/data_sources/transformers/data_transformer_json.rb +16 -0
- data/lib/repositories/data_sources/transformers/data_transformer_yaml.rb +16 -0
- data/lib/repositories/student_repository.rb +32 -0
- data/lib/state_holders/list_state_notifier.rb +60 -0
- data/lib/task/controllers/task_input_form_controller_create.rb +43 -0
- data/lib/task/controllers/task_input_form_controller_edit.rb +57 -0
- data/lib/task/controllers/task_list_controller.rb +93 -0
- data/lib/task/task_db_data_source.rb +85 -0
- data/lib/task/ui/task_input_form.rb +67 -0
- data/lib/task/ui/task_input_form_factory.rb +26 -0
- data/lib/task/ui/task_list_view.rb +163 -0
- data/lib/user/controllers/user_input_form_controller_create.rb +42 -0
- data/lib/user/controllers/user_input_form_controller_edit.rb +53 -0
- data/lib/user/controllers/user_list_controller.rb +99 -0
- data/lib/user/ui/user_input_form.rb +69 -0
- data/lib/user/ui/user_list_view.rb +170 -0
- data/lib/user/user_db_data_source.rb +71 -0
- data/lib/views/main_window.rb +32 -0
- data/lib/views/tab_students.rb +148 -0
- data/papaSquidLib.gemspec +15 -0
- data/test/manager_test.rb +27 -0
- data/test/state_notifier_test.rb +82 -0
- data/test/task_test.rb +51 -0
- data/test/user_test.rb +39 -0
- metadata +113 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'mysql2'
|
2
|
+
require_relative '../data_sources/db_client'
|
3
|
+
|
4
|
+
class UserDbDataSource
|
5
|
+
def initialize
|
6
|
+
@client = DBClient.instance
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
# добавляет нового пользователя в базу данных, возвращает созданную запись.
|
11
|
+
def add(user)
|
12
|
+
query = "INSERT INTO User (FirstName, LastName, FatherName) VALUES ('#{user.first_name}', '#{user.last_name}', #{user.father_name.nil? ? 'NULL' : "'#{user.father_name}'"})"
|
13
|
+
@client.query(query)
|
14
|
+
user_id = @client.last_id
|
15
|
+
get(user_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
# изменяет данные об пользователе в базе данных, возвращает измененную запись.
|
19
|
+
def change(user)
|
20
|
+
query = "UPDATE User SET FirstName='#{user.first_name}', LastName='#{user.last_name}', FatherName=#{user.father_name.nil? ? 'NULL' : "'#{user.father_name}'"} WHERE UserID=#{user.user_id}"
|
21
|
+
@client.query(query)
|
22
|
+
get(user.user_id)
|
23
|
+
end
|
24
|
+
|
25
|
+
# удаляет запись об пользователе из базы данных.
|
26
|
+
def delete(id)
|
27
|
+
query = "DELETE FROM User WHERE UserID=#{id}"
|
28
|
+
@client.query(query)
|
29
|
+
end
|
30
|
+
|
31
|
+
# возвращает запись об пользователе по заданному id.
|
32
|
+
def get(id)
|
33
|
+
query = "SELECT * FROM User WHERE UserID=#{id}"
|
34
|
+
result = @client.query(query).first
|
35
|
+
if result
|
36
|
+
User.new(result[:'UserID'], result[:'FirstName'], result[:'LastName'], result[:'FatherName'])
|
37
|
+
else
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# возвращает список пользователей с учетом фильтра по наличию отчества и сортировки, позволяет задавать количество элементов на странице и номер страницы.
|
43
|
+
def get_list(page_size, page_num, sort_field, sort_direction, has_father_name = nil)
|
44
|
+
offset = (page_num - 1) * page_size
|
45
|
+
query = "SELECT * FROM User"
|
46
|
+
|
47
|
+
if has_father_name == true
|
48
|
+
query += " WHERE FatherName IS NOT NULL"
|
49
|
+
elsif has_father_name == false
|
50
|
+
query += " WHERE FatherName IS NULL"
|
51
|
+
end
|
52
|
+
|
53
|
+
query += " ORDER BY #{sort_field} #{sort_direction} LIMIT #{page_size} OFFSET #{offset}"
|
54
|
+
results = @client.query(query)
|
55
|
+
|
56
|
+
users = []
|
57
|
+
results.each do |result|
|
58
|
+
users << User.new(result[:'UserID'], result[:'FirstName'], result[:'LastName'], result[:'FatherName'])
|
59
|
+
end
|
60
|
+
|
61
|
+
users
|
62
|
+
end
|
63
|
+
|
64
|
+
# возвращает количество записей об пользователях в базе данных.
|
65
|
+
def count
|
66
|
+
query = "SELECT COUNT(*) FROM User"
|
67
|
+
result = @client.query(query).first
|
68
|
+
|
69
|
+
result[:'COUNT(*)']
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'glimmer-dsl-libui'
|
4
|
+
require_relative '../user/ui/user_list_view'
|
5
|
+
require_relative '../manager/ui/manager_list_view'
|
6
|
+
require_relative '../task/ui/task_list_view'
|
7
|
+
require_relative 'tab_students'
|
8
|
+
|
9
|
+
|
10
|
+
class MainWindow
|
11
|
+
include Glimmer
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@view_tab_students = TabStudentsView.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
window('Задания', 1000, 600) {
|
19
|
+
tab {
|
20
|
+
tab_item('Пользователи') {
|
21
|
+
UserListView.new.create
|
22
|
+
}
|
23
|
+
tab_item('Менеджеры') {
|
24
|
+
ManagerListView.new.create
|
25
|
+
}
|
26
|
+
tab_item('Задания') {
|
27
|
+
TaskListView.new.create
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'glimmer-dsl-libui'
|
4
|
+
require './lib/controllers/tab_students_controller'
|
5
|
+
|
6
|
+
class TabStudentsView
|
7
|
+
include Glimmer
|
8
|
+
|
9
|
+
ITEMS_PER_PAGE = 20
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@controller = TabStudentsController.new(self)
|
13
|
+
@current_page = 1
|
14
|
+
@total_count = 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def on_create
|
18
|
+
@controller.on_view_created
|
19
|
+
@controller.refresh_data(@current_page, ITEMS_PER_PAGE)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Метод наблюдателя datalist
|
23
|
+
def on_datalist_changed(new_table)
|
24
|
+
arr = new_table.to_2d_array
|
25
|
+
arr.map { |row| row[3] = [row[3][:value], contact_color(row[3][:type])] }
|
26
|
+
@table.model_array = arr
|
27
|
+
end
|
28
|
+
|
29
|
+
def update_student_count(new_cnt)
|
30
|
+
@total_count = new_cnt
|
31
|
+
@page_label.text = "#{@current_page} / #{(@total_count / ITEMS_PER_PAGE.to_f).ceil}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def contact_color(type)
|
35
|
+
case type
|
36
|
+
when 'telegram'
|
37
|
+
'#00ADB5'
|
38
|
+
when 'email'
|
39
|
+
'#F08A5D'
|
40
|
+
when 'phone'
|
41
|
+
'#B83B5E'
|
42
|
+
else
|
43
|
+
'#000000'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def create
|
48
|
+
root_container = horizontal_box {
|
49
|
+
# Секция 1
|
50
|
+
vertical_box {
|
51
|
+
stretchy false
|
52
|
+
|
53
|
+
form {
|
54
|
+
stretchy false
|
55
|
+
|
56
|
+
@filter_last_name_initials = entry {
|
57
|
+
label 'Фамилия И. О.'
|
58
|
+
}
|
59
|
+
|
60
|
+
@filters = {}
|
61
|
+
fields = [[:git, 'Гит'], [:email, 'Почта'], [:phone, 'Телефон'], [:telegram, 'Телеграм']]
|
62
|
+
|
63
|
+
fields.each do |field|
|
64
|
+
@filters[field[0]] = {}
|
65
|
+
|
66
|
+
@filters[field[0]][:combobox] = combobox {
|
67
|
+
label "#{field[1]} имеется?"
|
68
|
+
items ['Не важно', 'Есть', 'Нет']
|
69
|
+
selected 0
|
70
|
+
|
71
|
+
on_selected do
|
72
|
+
if @filters[field[0]][:combobox].selected == 1
|
73
|
+
@filters[field[0]][:entry].read_only = false
|
74
|
+
else
|
75
|
+
@filters[field[0]][:entry].text = ''
|
76
|
+
@filters[field[0]][:entry].read_only = true
|
77
|
+
end
|
78
|
+
end
|
79
|
+
}
|
80
|
+
|
81
|
+
@filters[field[0]][:entry] = entry {
|
82
|
+
label field[1]
|
83
|
+
read_only true
|
84
|
+
}
|
85
|
+
end
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
# Секция 2
|
90
|
+
vertical_box {
|
91
|
+
@table = refined_table(
|
92
|
+
table_editable: false,
|
93
|
+
filter: lambda do |row_hash, query|
|
94
|
+
utf8_query = query.force_encoding("utf-8")
|
95
|
+
row_hash['Фамилия И. О'].include?(utf8_query)
|
96
|
+
end,
|
97
|
+
table_columns: {
|
98
|
+
'#' => :text,
|
99
|
+
'Фамилия И. О' => :text,
|
100
|
+
'Гит' => :text,
|
101
|
+
'Контакт' => :text_color
|
102
|
+
}
|
103
|
+
)
|
104
|
+
|
105
|
+
@pages = horizontal_box {
|
106
|
+
stretchy false
|
107
|
+
|
108
|
+
button("<") {
|
109
|
+
stretchy true
|
110
|
+
|
111
|
+
on_clicked do
|
112
|
+
@current_page = [@current_page - 1, 1].max
|
113
|
+
@controller.refresh_data(@current_page, ITEMS_PER_PAGE)
|
114
|
+
end
|
115
|
+
|
116
|
+
}
|
117
|
+
@page_label = label("...") { stretchy false }
|
118
|
+
button(">") {
|
119
|
+
stretchy true
|
120
|
+
|
121
|
+
on_clicked do
|
122
|
+
@current_page = [@current_page + 1, (@total_count / ITEMS_PER_PAGE.to_f).ceil].min
|
123
|
+
@controller.refresh_data(@current_page, ITEMS_PER_PAGE)
|
124
|
+
end
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
# Секция 3
|
130
|
+
vertical_box {
|
131
|
+
stretchy false
|
132
|
+
|
133
|
+
button('Добавить') { stretchy false }
|
134
|
+
button('Изменить') { stretchy false }
|
135
|
+
button('Удалить') { stretchy false }
|
136
|
+
button('Обновить') {
|
137
|
+
stretchy false
|
138
|
+
|
139
|
+
on_clicked {
|
140
|
+
@controller.refresh_data(@current_page, ITEMS_PER_PAGE)
|
141
|
+
}
|
142
|
+
}
|
143
|
+
}
|
144
|
+
}
|
145
|
+
on_create
|
146
|
+
root_container
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = 'papaSquidLib'
|
3
|
+
spec.version = '0.1.0'
|
4
|
+
spec.authors = ['KiTTeNqz']
|
5
|
+
spec.email = 'mrxameleonx@mail.ru'
|
6
|
+
spec.summary = 'papaSquidLib system'
|
7
|
+
spec.description = 'Simple ToDo app'
|
8
|
+
spec.homepage = 'https://github.com/KiTTeNqz/papaSquidLib'
|
9
|
+
spec.license = 'MIT'
|
10
|
+
|
11
|
+
spec.files = Dir.glob("**/*")
|
12
|
+
spec.require_paths = ['lib']
|
13
|
+
|
14
|
+
spec.add_dependency 'win32api'
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require_relative '../lib/models/manager'
|
3
|
+
|
4
|
+
class ManagerTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@manager = Manager.new(1, 'John Doe', 'johndoe@example.com', '89054037715')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_valid_manager_creation
|
10
|
+
assert_equal 1, @manager.id
|
11
|
+
assert_equal 'John Doe', @manager.name
|
12
|
+
assert_equal 'johndoe@example.com', @manager.email
|
13
|
+
assert_equal '89054037715', @manager.phone
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_manager_creation_with_invalid_name
|
17
|
+
assert_raises(ArgumentError) { Manager.new(1, nil, 'johndoe@example.com', '+79054037715') }
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_manager_creation_with_invalid_email
|
21
|
+
assert_raises(ArgumentError) { Manager.new(1, 'John Doe', 'invalidemail', '89054037715') }
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_manager_creation_with_invalid_phone
|
25
|
+
assert_raises(ArgumentError) { Manager.new(1, 'John Doe', 'johndoe@example.com', '123456') }
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require './lib/state_holders/list_state_notifier'
|
3
|
+
require_relative '../lib/logger'
|
4
|
+
class TestListStateNotifier < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@notifier = ListStateNotifier.new
|
7
|
+
LoggerHolder.instance.level = Logger::DEBUG
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_items_initialized_as_empty_array
|
11
|
+
assert_equal [], @notifier.items
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_set_all_sets_items_and_notifies_listeners
|
15
|
+
listener = MiniTest::Mock.new
|
16
|
+
listener.expect(:update, nil, [[1, 2, 3]])
|
17
|
+
@notifier.add_listener(listener)
|
18
|
+
|
19
|
+
@notifier.set_all([1, 2, 3])
|
20
|
+
|
21
|
+
assert_equal [1, 2, 3], @notifier.items
|
22
|
+
listener.verify
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_add_adds_item_and_notifies_listeners
|
26
|
+
listener = MiniTest::Mock.new
|
27
|
+
listener.expect(:update, nil, [@notifier.items])
|
28
|
+
@notifier.add_listener(listener)
|
29
|
+
|
30
|
+
@notifier.add(4)
|
31
|
+
|
32
|
+
assert_equal [4], @notifier.items
|
33
|
+
listener.verify
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_get_returns_correct_item
|
37
|
+
@notifier.set_all([1, 2, 3])
|
38
|
+
|
39
|
+
assert_equal 2, @notifier.get(1)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_delete_removes_item_and_notifies_listeners
|
43
|
+
@notifier.set_all([1, 2, 3])
|
44
|
+
listener = MiniTest::Mock.new
|
45
|
+
listener.expect(:update, nil, [@notifier.items])
|
46
|
+
@notifier.add_listener(listener)
|
47
|
+
|
48
|
+
@notifier.delete(2)
|
49
|
+
|
50
|
+
assert_equal [1, 3], @notifier.items
|
51
|
+
listener.verify
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_replace_replaces_item_and_notifies_listeners
|
55
|
+
@notifier.set_all([1, 2, 3])
|
56
|
+
listener = MiniTest::Mock.new
|
57
|
+
listener.expect(:update, nil, [@notifier.items])
|
58
|
+
@notifier.add_listener(listener)
|
59
|
+
|
60
|
+
@notifier.replace(2, 4)
|
61
|
+
|
62
|
+
assert_equal [1, 4, 3], @notifier.items
|
63
|
+
listener.verify
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_add_listener_adds_listener
|
67
|
+
listener = MiniTest::Mock.new
|
68
|
+
|
69
|
+
@notifier.add_listener(listener)
|
70
|
+
|
71
|
+
assert_includes @notifier.instance_variable_get(:@listeners), listener
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_delete_listener_removes_listener
|
75
|
+
listener = MiniTest::Mock.new
|
76
|
+
@notifier.add_listener(listener)
|
77
|
+
|
78
|
+
@notifier.delete_listener(listener)
|
79
|
+
|
80
|
+
refute_includes @notifier.instance_variable_get(:@listeners), listener
|
81
|
+
end
|
82
|
+
end
|
data/test/task_test.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require_relative '../lib/models/task'
|
3
|
+
|
4
|
+
class TaskTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@task = Task.new(1, 2, 3)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_valid_task_creation
|
10
|
+
assert_equal 1, @task.task_id
|
11
|
+
assert_equal 2, @task.user_id
|
12
|
+
assert_equal 3, @task.manager_id
|
13
|
+
assert_equal Time.now.strftime("%Y-%m-%d"), @task.date
|
14
|
+
assert_nil @task.description
|
15
|
+
assert_equal 'Undone', @task.completed
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_task_creation_with_custom_date
|
19
|
+
custom_date = '2023-05-20'
|
20
|
+
task = Task.new(1, 2, 3, custom_date)
|
21
|
+
assert_equal custom_date, task.date
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_task_creation_with_description
|
25
|
+
description = 'Task description'
|
26
|
+
task = Task.new(1, 2, 3, nil, description)
|
27
|
+
assert_equal description, task.description
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_task_creation_with_completed_status
|
31
|
+
completed = 'Done'
|
32
|
+
task = Task.new(1, 2, 3, nil, nil, completed)
|
33
|
+
assert_equal completed, task.completed
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_task_creation_with_invalid_task_id
|
37
|
+
assert_raises(ArgumentError) { Task.new(nil, 2, 3) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_task_creation_with_invalid_user_id
|
41
|
+
assert_raises(ArgumentError) { Task.new(1, nil, 3) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_task_creation_with_invalid_manager_id
|
45
|
+
assert_raises(ArgumentError) { Task.new(1, 2, nil) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_task_creation_with_invalid_completed_status
|
49
|
+
assert_raises(ArgumentError) { Task.new(1, 2, 3, nil, nil, 'Invalid') }
|
50
|
+
end
|
51
|
+
end
|
data/test/user_test.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require_relative '../lib/models/user'
|
3
|
+
|
4
|
+
class UserTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@user = User.new(1, 'John', 'Doe', 'Smith')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_valid_user_creation
|
10
|
+
assert_equal 1, @user.user_id
|
11
|
+
assert_equal 'John', @user.first_name
|
12
|
+
assert_equal 'Doe', @user.last_name
|
13
|
+
assert_equal 'Smith', @user.father_name
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_user_creation_without_father_name
|
17
|
+
user = User.new(1, 'John', 'Doe')
|
18
|
+
assert_nil user.father_name
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_user_creation_with_invalid_user_id
|
22
|
+
assert_raises(ArgumentError) { User.new(nil, 'John', 'Doe') }
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_user_creation_with_invalid_first_name
|
26
|
+
assert_raises(ArgumentError) { User.new(1, nil, 'Doe') }
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_user_creation_with_invalid_last_name
|
30
|
+
assert_raises(ArgumentError) { User.new(1, 'John', nil) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_user_creation_with_long_name
|
34
|
+
long_name = 'x' * 51
|
35
|
+
assert_raises(ArgumentError) { User.new(1, long_name, 'Doe') }
|
36
|
+
assert_raises(ArgumentError) { User.new(1, 'John', long_name) }
|
37
|
+
assert_raises(ArgumentError) { User.new(1, long_name, 'Doe', 'Smith') }
|
38
|
+
end
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: papaSquidLib
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- KiTTeNqz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-05-20 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: Simple ToDo app
|
28
|
+
email: mrxameleonx@mail.ru
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- Gemfile
|
34
|
+
- Gemfile.lock
|
35
|
+
- lib/controllers/tab_students_controller.rb
|
36
|
+
- lib/data_sources/db_client.rb
|
37
|
+
- lib/db_config/config.yaml
|
38
|
+
- lib/db_config/library_config.yaml
|
39
|
+
- lib/db_config/migrations/create_db.sql
|
40
|
+
- lib/db_config/migrations/create_tables.sql
|
41
|
+
- lib/db_config/mock_data/mock_data.sql
|
42
|
+
- lib/logger.rb
|
43
|
+
- lib/main.rb
|
44
|
+
- lib/manager/controllers/manager_input_form_controller_create.rb
|
45
|
+
- lib/manager/controllers/manager_input_form_controller_edit.rb
|
46
|
+
- lib/manager/controllers/manager_list_controller.rb
|
47
|
+
- lib/manager/manager_db_data_source.rb
|
48
|
+
- lib/manager/ui/manager_input_form.rb
|
49
|
+
- lib/manager/ui/manager_list_view.rb
|
50
|
+
- lib/models/manager.rb
|
51
|
+
- lib/models/student.rb
|
52
|
+
- lib/models/student_base.rb
|
53
|
+
- lib/models/student_short.rb
|
54
|
+
- lib/models/task.rb
|
55
|
+
- lib/models/user.rb
|
56
|
+
- lib/papaSquidLib/version.rb
|
57
|
+
- lib/papa_squid_lib.rb
|
58
|
+
- lib/repositories/adapters/db_source_adapter.rb
|
59
|
+
- lib/repositories/adapters/file_source_adapter.rb
|
60
|
+
- lib/repositories/containers/data_list.rb
|
61
|
+
- lib/repositories/containers/data_list_student_short.rb
|
62
|
+
- lib/repositories/containers/data_table.rb
|
63
|
+
- lib/repositories/data_sources/db_data_source.rb
|
64
|
+
- lib/repositories/data_sources/file_data_source.rb
|
65
|
+
- lib/repositories/data_sources/transformers/data_transformer_base.rb
|
66
|
+
- lib/repositories/data_sources/transformers/data_transformer_json.rb
|
67
|
+
- lib/repositories/data_sources/transformers/data_transformer_yaml.rb
|
68
|
+
- lib/repositories/student_repository.rb
|
69
|
+
- lib/state_holders/list_state_notifier.rb
|
70
|
+
- lib/task/controllers/task_input_form_controller_create.rb
|
71
|
+
- lib/task/controllers/task_input_form_controller_edit.rb
|
72
|
+
- lib/task/controllers/task_list_controller.rb
|
73
|
+
- lib/task/task_db_data_source.rb
|
74
|
+
- lib/task/ui/task_input_form.rb
|
75
|
+
- lib/task/ui/task_input_form_factory.rb
|
76
|
+
- lib/task/ui/task_list_view.rb
|
77
|
+
- lib/user/controllers/user_input_form_controller_create.rb
|
78
|
+
- lib/user/controllers/user_input_form_controller_edit.rb
|
79
|
+
- lib/user/controllers/user_list_controller.rb
|
80
|
+
- lib/user/ui/user_input_form.rb
|
81
|
+
- lib/user/ui/user_list_view.rb
|
82
|
+
- lib/user/user_db_data_source.rb
|
83
|
+
- lib/views/main_window.rb
|
84
|
+
- lib/views/tab_students.rb
|
85
|
+
- papaSquidLib.gemspec
|
86
|
+
- test/manager_test.rb
|
87
|
+
- test/state_notifier_test.rb
|
88
|
+
- test/task_test.rb
|
89
|
+
- test/user_test.rb
|
90
|
+
homepage: https://github.com/KiTTeNqz/papaSquidLib
|
91
|
+
licenses:
|
92
|
+
- MIT
|
93
|
+
metadata: {}
|
94
|
+
post_install_message:
|
95
|
+
rdoc_options: []
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubygems_version: 3.4.10
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: papaSquidLib system
|
113
|
+
test_files: []
|