papaSquidLib 0.1.0

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 (59) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +9 -0
  3. data/Gemfile.lock +69 -0
  4. data/lib/controllers/tab_students_controller.rb +43 -0
  5. data/lib/data_sources/db_client.rb +35 -0
  6. data/lib/db_config/config.yaml +5 -0
  7. data/lib/db_config/library_config.yaml +5 -0
  8. data/lib/db_config/migrations/create_db.sql +3 -0
  9. data/lib/db_config/migrations/create_tables.sql +29 -0
  10. data/lib/db_config/mock_data/mock_data.sql +72 -0
  11. data/lib/logger.rb +27 -0
  12. data/lib/main.rb +6 -0
  13. data/lib/manager/controllers/manager_input_form_controller_create.rb +44 -0
  14. data/lib/manager/controllers/manager_input_form_controller_edit.rb +54 -0
  15. data/lib/manager/controllers/manager_list_controller.rb +99 -0
  16. data/lib/manager/manager_db_data_source.rb +63 -0
  17. data/lib/manager/ui/manager_input_form.rb +69 -0
  18. data/lib/manager/ui/manager_list_view.rb +168 -0
  19. data/lib/models/manager.rb +41 -0
  20. data/lib/models/student.rb +102 -0
  21. data/lib/models/student_base.rb +100 -0
  22. data/lib/models/student_short.rb +50 -0
  23. data/lib/models/task.rb +49 -0
  24. data/lib/models/user.rb +32 -0
  25. data/lib/papaSquidLib/version.rb +5 -0
  26. data/lib/papa_squid_lib.rb +6 -0
  27. data/lib/repositories/adapters/db_source_adapter.rb +54 -0
  28. data/lib/repositories/adapters/file_source_adapter.rb +37 -0
  29. data/lib/repositories/containers/data_list.rb +74 -0
  30. data/lib/repositories/containers/data_list_student_short.rb +18 -0
  31. data/lib/repositories/containers/data_table.rb +35 -0
  32. data/lib/repositories/data_sources/db_data_source.rb +32 -0
  33. data/lib/repositories/data_sources/file_data_source.rb +75 -0
  34. data/lib/repositories/data_sources/transformers/data_transformer_base.rb +15 -0
  35. data/lib/repositories/data_sources/transformers/data_transformer_json.rb +16 -0
  36. data/lib/repositories/data_sources/transformers/data_transformer_yaml.rb +16 -0
  37. data/lib/repositories/student_repository.rb +32 -0
  38. data/lib/state_holders/list_state_notifier.rb +60 -0
  39. data/lib/task/controllers/task_input_form_controller_create.rb +43 -0
  40. data/lib/task/controllers/task_input_form_controller_edit.rb +57 -0
  41. data/lib/task/controllers/task_list_controller.rb +93 -0
  42. data/lib/task/task_db_data_source.rb +85 -0
  43. data/lib/task/ui/task_input_form.rb +67 -0
  44. data/lib/task/ui/task_input_form_factory.rb +26 -0
  45. data/lib/task/ui/task_list_view.rb +163 -0
  46. data/lib/user/controllers/user_input_form_controller_create.rb +42 -0
  47. data/lib/user/controllers/user_input_form_controller_edit.rb +53 -0
  48. data/lib/user/controllers/user_list_controller.rb +99 -0
  49. data/lib/user/ui/user_input_form.rb +69 -0
  50. data/lib/user/ui/user_list_view.rb +170 -0
  51. data/lib/user/user_db_data_source.rb +71 -0
  52. data/lib/views/main_window.rb +32 -0
  53. data/lib/views/tab_students.rb +148 -0
  54. data/papaSquidLib.gemspec +15 -0
  55. data/test/manager_test.rb +27 -0
  56. data/test/state_notifier_test.rb +82 -0
  57. data/test/task_test.rb +51 -0
  58. data/test/user_test.rb +39 -0
  59. 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: []