papaSquidLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []