starproxima_library 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 (69) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +9 -0
  3. data/Gemfile.lock +69 -0
  4. data/diagrams/add_uthor_seq.png +0 -0
  5. data/diagrams/add_uthor_seq.puml +42 -0
  6. data/diagrams/author.png +0 -0
  7. data/diagrams/author.puml +118 -0
  8. data/diagrams/core.png +0 -0
  9. data/diagrams/core.puml +103 -0
  10. data/diagrams/delete_author.png +0 -0
  11. data/diagrams/delete_author.puml +25 -0
  12. data/diagrams/edit_author.png +0 -0
  13. data/diagrams/edit_author.puml +48 -0
  14. data/diagrams/er.png +0 -0
  15. data/diagrams/er.puml +30 -0
  16. data/diagrams/publisher.png +0 -0
  17. data/diagrams/publisher.puml +118 -0
  18. data/diagrams/requirements.docx +0 -0
  19. data/diagrams/start.png +0 -0
  20. data/diagrams/start.puml +74 -0
  21. data/lib/author/author_db_data_source.rb +90 -0
  22. data/lib/author/controllers/author_controller.rb +57 -0
  23. data/lib/author/controllers/author_input_form_controller_create.rb +44 -0
  24. data/lib/author/controllers/author_input_form_controller_edit.rb +53 -0
  25. data/lib/author/controllers/author_list_controller.rb +107 -0
  26. data/lib/author/ui/author_input_form.rb +69 -0
  27. data/lib/author/ui/author_list_view.rb +170 -0
  28. data/lib/controllers/tab_students_controller.rb +43 -0
  29. data/lib/data_sources/book_db_data_source.rb +43 -0
  30. data/lib/data_sources/db_client.rb +34 -0
  31. data/lib/db_config/config.yaml +5 -0
  32. data/lib/db_config/library_config.yaml +5 -0
  33. data/lib/db_config/migrations/create_db.sql +3 -0
  34. data/lib/db_config/migrations/create_tables.sql +27 -0
  35. data/lib/db_config/mock_data/mock_data.sql +49 -0
  36. data/lib/logger.rb +27 -0
  37. data/lib/main.rb +6 -0
  38. data/lib/models/author.rb +32 -0
  39. data/lib/models/book.rb +31 -0
  40. data/lib/models/publisher.rb +37 -0
  41. data/lib/models/student.rb +102 -0
  42. data/lib/models/student_base.rb +100 -0
  43. data/lib/models/student_short.rb +50 -0
  44. data/lib/publisher/controllers/publisher_input_form_controller_create.rb +44 -0
  45. data/lib/publisher/controllers/publisher_input_form_controller_edit.rb +52 -0
  46. data/lib/publisher/controllers/publisher_list_controller.rb +99 -0
  47. data/lib/publisher/publisher_db_data_source.rb +63 -0
  48. data/lib/publisher/ui/publisher_input_form.rb +69 -0
  49. data/lib/publisher/ui/publisher_list_view.rb +168 -0
  50. data/lib/repositories/adapters/db_source_adapter.rb +54 -0
  51. data/lib/repositories/adapters/file_source_adapter.rb +37 -0
  52. data/lib/repositories/containers/data_list.rb +74 -0
  53. data/lib/repositories/containers/data_list_student_short.rb +18 -0
  54. data/lib/repositories/containers/data_table.rb +35 -0
  55. data/lib/repositories/data_sources/db_data_source.rb +32 -0
  56. data/lib/repositories/data_sources/file_data_source.rb +75 -0
  57. data/lib/repositories/data_sources/transformers/data_transformer_base.rb +15 -0
  58. data/lib/repositories/data_sources/transformers/data_transformer_json.rb +16 -0
  59. data/lib/repositories/data_sources/transformers/data_transformer_yaml.rb +16 -0
  60. data/lib/repositories/student_repository.rb +32 -0
  61. data/lib/state_holders/list_state_notifier.rb +60 -0
  62. data/lib/views/main_window.rb +32 -0
  63. data/lib/views/tab_students.rb +148 -0
  64. data/starproxima_library.gemspec +15 -0
  65. data/test/author_test.rb +51 -0
  66. data/test/book_test.rb +33 -0
  67. data/test/publisher_test.rb +39 -0
  68. data/test/state_notifier_test.rb +80 -0
  69. metadata +123 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8e0482becdd96f5686269b12e189d7caefc695855e65369c1f773884f54e20af
4
+ data.tar.gz: '043708e140cfbd4bc64e136cad5edf3d5081bc801375929275e34fadc0c3106c'
5
+ SHA512:
6
+ metadata.gz: 596c7d541ee529adc49b5195e7830e5862686bfc9e82471c8e91d4b28154625013f8e02544d95d2566e08b531f5b32d38041844ff3a9ac2560631f64cbb41dfd
7
+ data.tar.gz: fe863937eed29f397a70f63a52f0c9f72402806f245c82ab9acca91c51679fdadb7f044cad7f96af312590951218082160a879af3b74daebd5ef2a8ea13a1981
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "mysql2"
6
+ gem "glimmer-dsl-libui", "~> 0.7.4"
7
+ gem 'win32api'
8
+ gem "minitest"
9
+ gem 'rubocop', group: 'development'
data/Gemfile.lock ADDED
@@ -0,0 +1,69 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ array_include_methods (1.4.0)
5
+ ast (2.4.2)
6
+ chunky_png (1.4.0)
7
+ color (1.8)
8
+ equalizer (0.0.11)
9
+ facets (3.1.0)
10
+ glimmer (2.7.3)
11
+ array_include_methods (~> 1.4.0)
12
+ facets (>= 3.1.0, < 4.0.0)
13
+ glimmer-dsl-libui (0.7.4)
14
+ chunky_png (~> 1.4.0)
15
+ color (~> 1.8)
16
+ equalizer (= 0.0.11)
17
+ glimmer (~> 2.7.3)
18
+ libui (~> 0.1.2.pre)
19
+ os (>= 1.0.0, < 2.0.0)
20
+ perfect-shape (~> 1.0.7)
21
+ rouge (>= 3.26.0, < 4.0.0)
22
+ super_module (~> 1.4.1)
23
+ json (2.6.3)
24
+ libui (0.1.2.pre-x64-mingw)
25
+ matrix (0.4.2)
26
+ method_source (1.0.0)
27
+ minitest (5.16.3)
28
+ mysql2 (0.5.5)
29
+ os (1.1.4)
30
+ parallel (1.22.1)
31
+ parser (3.2.2.0)
32
+ ast (~> 2.4.1)
33
+ perfect-shape (1.0.7)
34
+ equalizer (>= 0.0.11, < 1.1.0)
35
+ matrix (>= 0.4.2, < 1.1.0)
36
+ rainbow (3.1.1)
37
+ regexp_parser (2.7.0)
38
+ rexml (3.2.5)
39
+ rouge (3.30.0)
40
+ rubocop (1.50.1)
41
+ json (~> 2.3)
42
+ parallel (~> 1.10)
43
+ parser (>= 3.2.0.0)
44
+ rainbow (>= 2.2.2, < 4.0)
45
+ regexp_parser (>= 1.8, < 3.0)
46
+ rexml (>= 3.2.5, < 4.0)
47
+ rubocop-ast (>= 1.28.0, < 2.0)
48
+ ruby-progressbar (~> 1.7)
49
+ unicode-display_width (>= 2.4.0, < 3.0)
50
+ rubocop-ast (1.28.0)
51
+ parser (>= 3.2.1.0)
52
+ ruby-progressbar (1.13.0)
53
+ super_module (1.4.1)
54
+ method_source (>= 0.8.2, < 1.1.0)
55
+ unicode-display_width (2.4.2)
56
+ win32api (0.1.0)
57
+
58
+ PLATFORMS
59
+ x64-mingw-ucrt
60
+
61
+ DEPENDENCIES
62
+ glimmer-dsl-libui (~> 0.7.4)
63
+ minitest
64
+ mysql2
65
+ rubocop
66
+ win32api
67
+
68
+ BUNDLED WITH
69
+ 2.4.10
Binary file
@@ -0,0 +1,42 @@
1
+ @startuml
2
+ 'https://plantuml.com/sequence-diagram
3
+
4
+
5
+
6
+ actor Пользователь as user
7
+ boundary "ts: AuthorListView" as ts
8
+ control "tsс: AuthorListController" as tsc
9
+ boundary "sif: AuthorInputForm" as sif
10
+ control "sifcc: AuthorInputFormControllerCreate" as sifcc
11
+ entity "srep: AuthorDBDataSource" as srep
12
+
13
+ user -> ts : Клик на <<Добавить>>
14
+ ts -> tsc : show_modal_add
15
+ tsc -> sifcc : <<new>>
16
+ sifcc --> tsc
17
+ tsc -> sif : <<new>>
18
+ sif --> tsc
19
+ tsc -> sifcc : set_view
20
+ sifcc --> tsc
21
+ tsc -> sif : create
22
+ sif -> sifcc : on_view_created
23
+ sifcc -> srep : <<new>>
24
+ srep --> sifcc
25
+ sifcc --> sif
26
+ sif --> tsc
27
+ tsc -> sif : show
28
+ sif --> tsc
29
+ tsc --> ts
30
+ ts --> user
31
+
32
+ user -> sif : Клик на <<Сохранить>>
33
+ sif -> sifcc : process_fields
34
+ sifcc -> srep : add_student
35
+ srep --> sifcc
36
+ sifcc -> sif : close
37
+ sif --> sifcc
38
+ sifcc --> sif
39
+ sif --> user
40
+
41
+
42
+ @enduml
Binary file
@@ -0,0 +1,118 @@
1
+ @startuml
2
+
3
+ AuthorListView *-- AuthorListController
4
+ AuthorListView --* AuthorListController
5
+
6
+ AuthorListView -> AuthorInputForm
7
+ AuthorListController o-- ListStateNotifier
8
+ AuthorListController o-- AuthorDBDataSource
9
+
10
+ AuthorInputFormControllerCreate o-- AuthorDBDataSource
11
+ AuthorInputFormControllerEdit o-- AuthorDBDataSource
12
+
13
+ AuthorInputForm *-- AuthorInputFormControllerCreate
14
+ AuthorInputForm *-- AuthorInputFormControllerEdit
15
+ AuthorInputForm --* AuthorInputFormControllerCreate
16
+ AuthorInputForm --* AuthorInputFormControllerEdit
17
+ AuthorDBDataSource o-- DBClient
18
+
19
+ class AuthorDBDataSource {
20
+ + initialize()
21
+ + add(author: Author): Author
22
+ + change(author: Author): Author
23
+ + delete(id: Integer): void
24
+ + get(id: Integer): Author
25
+ + get_list(page_size: Integer, page_num: Integer, sort_field: String, sort_direction: String, has_father_name: Boolean): List<Author>
26
+ + count(): Integer
27
+ }
28
+
29
+ class DBClient {
30
+ + self.instance(): DBClient
31
+ + query(sql: String): Object
32
+ + last_id(): Integer
33
+ }
34
+
35
+ class AuthorListController {
36
+ - view: Object
37
+ - state_notifier: ListStateNotifier
38
+ - author_rep: AuthorDBDataSource
39
+ - sort_columns: Array<String>
40
+ - sort_by: String
41
+ - father_name_filter_columns: Array<Boolean>
42
+ - father_name_filter: Boolean
43
+ + on_view_created()
44
+ + show_view()
45
+ + show_modal_add()
46
+ + show_modal_edit(current_page: int, per_page: int, selected_row: int)
47
+ + delete_selected(current_page: int, per_page: int, selected_row: int)
48
+ + refresh_data(page: int, per_page: int)
49
+ + sort(page: int, per_page: int, sort_index: int)
50
+ + filter_father_name(page: int, per_page: int, filter_index: int)
51
+ - on_db_conn_error()
52
+ }
53
+ class ListStateNotifier {
54
+ - items: Array
55
+ - listeners: Array
56
+ + initialize()
57
+ + set_all(objects: Array)
58
+ + add(object: Object)
59
+ + get(number: Integer): Object
60
+ + delete(object: Object)
61
+ + replace(object: Object, new_object: Object)
62
+ + add_listener(listener: Object)
63
+ + delete_listener(listener: Object)
64
+ - notify_listeners()
65
+ }
66
+ class AuthorDBDataSource {
67
+ + get_list(limit: int, offset: int, sort_by: String, sort_order: String, father_name_filter: Boolean): Array<Author>
68
+ + add(item: Author): Author
69
+ + delete(id: int): void
70
+ + count(): int
71
+ }
72
+ class AuthorInputFormControllerCreate {
73
+ - parent_controller: AuthorListController
74
+ - author_rep: AuthorDBDataSource
75
+ - view: Object
76
+ + on_view_created()
77
+ + set_view(view: Object)
78
+ + process_fields(fields: Hash<String, String>): void
79
+ - on_db_conn_error()
80
+ }
81
+ class AuthorInputFormControllerEdit {
82
+ - parent_controller: AuthorListController
83
+ - item: Author
84
+ - author_rep: AuthorDBDataSource
85
+ - view: Object
86
+ + on_view_created()
87
+ + set_view(view: Object)
88
+ + populate_fields(item: Author): void
89
+ - on_db_conn_error()
90
+ }
91
+ class AuthorListView {
92
+ - PAGE_SIZE: integer = 20
93
+ - controller: AuthorListController
94
+ - current_page: integer = 1
95
+ - total_count: integer = 0
96
+ - items: Struct[]
97
+ - table: refined_table
98
+ - page_label: label
99
+ + initialize()
100
+ + on_create()
101
+ + update(authors: Author[])
102
+ + update_student_count(new_cnt: integer)
103
+ + create()
104
+ }
105
+
106
+ class AuthorInputForm {
107
+ - item: Hash
108
+ - controller: AuthorInputFormControllerCreate
109
+ - entries: Hash
110
+ + initialize(controller: AuthorInputFormControllerCreate, existing_student: Author)
111
+ + on_create()
112
+ + create()
113
+ }
114
+
115
+
116
+
117
+
118
+ @enduml
data/diagrams/core.png ADDED
Binary file
@@ -0,0 +1,103 @@
1
+ @startuml
2
+ @startuml
3
+ class AuthorDBDataSource {
4
+ - client: DBClient
5
+ + initialize()
6
+ + add(author: Author): Author
7
+ + change(author: Author): Author
8
+ + delete(id: int): void
9
+ + get(id: int): Author
10
+ + get_list(page_size: int, page_num: int, sort_field: string, sort_direction: string, has_father_name: bool = nil): Author[]
11
+ + count(): int
12
+ }
13
+
14
+ class PublisherDBDataSource {
15
+ - client: DBClient
16
+ + initialize()
17
+ + add(publisher: Publisher): Publisher
18
+ + change(publisher: Publisher): Publisher
19
+ + delete(id: int): void
20
+ + get(id: int): Publisher
21
+ + get_list(page_size: int, page_num: int, sort_field: string, sort_direction: string, has_email: bool = nil): Publisher[]
22
+ + count(): int
23
+ }
24
+
25
+ class BookDBDataSource {
26
+ - client: DBClient
27
+ + initialize()
28
+ + add(book: Book): Book
29
+ + change(book: Book): Book
30
+ + delete(id: int): void
31
+ + get(id: int): Book
32
+ + get_list(page_size: int, page_num: int, sort_field: string, sort_direction: string, author_id: int = nil, publisher_id: int = nil, min_year: int = nil, max_year: int = nil): Book[]
33
+ + count(author_id: int = nil, publisher_id: int = nil, min_year: int = nil, max_year: int = nil): int
34
+ }
35
+
36
+ class DBClient {
37
+ - connection: Mysql2::Client
38
+ - last_id: int
39
+ - initialize()
40
+ + query(query: string): Mysql2::Result
41
+ + last_id(): int
42
+ }
43
+
44
+ class Author {
45
+ - author_id
46
+ - first_name
47
+ - last_name
48
+ - father_name
49
+
50
+ + initialize(author_id, first_name, last_name, father_name = nil)
51
+ - validate_null(name, value)
52
+ - validate_name_length(first_name, last_name, father_name)
53
+ }
54
+
55
+ class Book {
56
+ - book_id
57
+ - title
58
+ - author_id
59
+ - publisher_id
60
+
61
+ + initialize(book_id, title, author_id, publisher_id)
62
+ - validate_null(name, value)
63
+ - validate_title_length(title)
64
+ }
65
+
66
+ class Publisher {
67
+ EMAIL_REGEX
68
+ - publisher_id
69
+ - name
70
+ - email
71
+
72
+ + initialize(publisher_id, name, email = nil)
73
+ - validate_null(name, value)
74
+ - validate_name_length(name)
75
+ - validate_email(email)
76
+ }
77
+ class ListStateNotifier {
78
+ - items: Array
79
+ - listeners: Array
80
+ + initialize()
81
+ + set_all(objects: Array)
82
+ + add(object: Object)
83
+ + get(number: Integer): Object
84
+ + delete(object: Object)
85
+ + replace(object: Object, new_object: Object)
86
+ + add_listener(listener: Object)
87
+ + delete_listener(listener: Object)
88
+ - notify_listeners()
89
+ }
90
+
91
+ Author --o Book
92
+ Book o-- Publisher
93
+ AuthorDBDataSource o-- DBClient
94
+ PublisherDBDataSource o-- DBClient
95
+ BookDBDataSource o-- DBClient
96
+ AuthorDBDataSource ..> Author
97
+ PublisherDBDataSource ..> Publisher
98
+ BookDBDataSource ..> Book
99
+
100
+
101
+
102
+
103
+ @enduml
Binary file
@@ -0,0 +1,25 @@
1
+ @startuml
2
+ 'https://plantuml.com/sequence-diagram
3
+
4
+
5
+ actor Пользователь as user
6
+ boundary "ts: AuthorListView" as ts
7
+ control "tsс: AuthorListController" as tsc
8
+ entity "srep: AuthorDBDataSource" as srep
9
+
10
+ user -> ts : Клик на <<Удалить>>
11
+ ts -> tsc : delete_selected
12
+ tsc -> srep : remove_student
13
+ srep --> tsc
14
+ tsc --> ts
15
+ ts -> tsc : refresh_data
16
+ tsc -> srep : paginated_short_students
17
+ srep --> tsc
18
+ tsc -> ts : update_student_count
19
+ ts --> tsc
20
+ tsc --> ts
21
+ ts --> user
22
+
23
+ @enduml
24
+
25
+
Binary file
@@ -0,0 +1,48 @@
1
+ @startuml
2
+ 'https://plantuml.com/sequence-diagram
3
+
4
+ actor Пользователь as user
5
+ boundary "ts: AuthorListView" as ts
6
+ control "tsс: AuthorListController" as tsc
7
+ boundary "sif: AuthorInputForm" as sif
8
+ control "sifce: AuthorInputFormControllerEdit" as sifce
9
+ entity "srep: AuthorDBDataSource" as srep
10
+
11
+ user -> ts : Клик на <<Изменить>>
12
+ ts -> tsc : show_modal_edit
13
+ tsc -> sifce : <<new>>
14
+ sifce --> tsc
15
+ tsc -> sif : <<new>>
16
+ sif --> tsc
17
+ tsc -> sifce : set_view
18
+ sifce --> tsc
19
+ tsc -> sif : create
20
+ sif -> sifce : on_view_created
21
+ sifce -> srep : <<new>>
22
+ srep --> sifce
23
+ sifce -> srep : student_by_id
24
+ srep --> sifce
25
+ sifce -> sif : make_readonly
26
+ sif --> sifce
27
+ sifce -> sif : set_value
28
+ sif --> sifce
29
+ sifce --> sif
30
+ sif --> tsc
31
+ tsc -> sif : show
32
+ sif --> tsc
33
+ tsc --> ts
34
+ ts --> user
35
+
36
+ user -> sif : Клик на <<Сохранить>>
37
+ sif -> sifce : process_fields
38
+ sifce -> srep : replace_student
39
+ srep --> sifce
40
+ sifce -> sif : close
41
+ sif --> sifce
42
+ sifce --> sif
43
+ sif --> user
44
+
45
+
46
+
47
+ @enduml
48
+
data/diagrams/er.png ADDED
Binary file
data/diagrams/er.puml ADDED
@@ -0,0 +1,30 @@
1
+ @startuml
2
+
3
+ entity Author {
4
+ +AuthorID [PK]
5
+ --
6
+ FirstName
7
+ LastName
8
+ FatherName
9
+ }
10
+
11
+ entity Publisher {
12
+ +PublisherID [PK]
13
+ --
14
+ Name
15
+ Email
16
+ }
17
+
18
+ entity Book {
19
+ +BookID [PK]
20
+ --
21
+ Title
22
+ --
23
+ +AuthorID [FK]
24
+ +PublisherID [FK]
25
+ }
26
+
27
+ Author --{ Book
28
+ Publisher --{ Book
29
+
30
+ @enduml
Binary file
@@ -0,0 +1,118 @@
1
+ @startuml
2
+
3
+ PublisherListView *-- PublisherListController
4
+ PublisherListView --* PublisherListController
5
+
6
+ PublisherListView -> PublisherInputForm
7
+ PublisherListController o-- ListStateNotifier
8
+ PublisherListController o-- PublisherDBDataSource
9
+
10
+ PublisherInputFormControllerCreate o-- PublisherDBDataSource
11
+ PublisherInputFormControllerEdit o-- PublisherDBDataSource
12
+
13
+ PublisherInputForm *-- PublisherInputFormControllerCreate
14
+ PublisherInputForm *-- PublisherInputFormControllerEdit
15
+ PublisherInputForm --* PublisherInputFormControllerCreate
16
+ PublisherInputForm --* PublisherInputFormControllerEdit
17
+ PublisherDBDataSource o-- DBClient
18
+
19
+ class PublisherDBDataSource {
20
+ + initialize()
21
+ + add(publisher: Publisher): Publisher
22
+ + change(publisher: Publisher): Publisher
23
+ + delete(id: Integer): void
24
+ + get(id: Integer): Publisher
25
+ + get_list(page_size: Integer, page_num: Integer, sort_field: String, sort_direction: String, has_father_name: Boolean): List<Publisher>
26
+ + count(): Integer
27
+ }
28
+
29
+ class DBClient {
30
+ + self.instance(): DBClient
31
+ + query(sql: String): Object
32
+ + last_id(): Integer
33
+ }
34
+
35
+ class PublisherListController {
36
+ - view: Object
37
+ - state_notifier: ListStateNotifier
38
+ - publisher_rep: PublisherDBDataSource
39
+ - sort_columns: Array<String>
40
+ - sort_by: String
41
+ - father_name_filter_columns: Array<Boolean>
42
+ - father_name_filter: Boolean
43
+ + on_view_created()
44
+ + show_view()
45
+ + show_modal_add()
46
+ + show_modal_edit(current_page: int, per_page: int, selected_row: int)
47
+ + delete_selected(current_page: int, per_page: int, selected_row: int)
48
+ + refresh_data(page: int, per_page: int)
49
+ + sort(page: int, per_page: int, sort_index: int)
50
+ + filter_father_name(page: int, per_page: int, filter_index: int)
51
+ - on_db_conn_error()
52
+ }
53
+ class ListStateNotifier {
54
+ - items: Array
55
+ - listeners: Array
56
+ + initialize()
57
+ + set_all(objects: Array)
58
+ + add(object: Object)
59
+ + get(number: Integer): Object
60
+ + delete(object: Object)
61
+ + replace(object: Object, new_object: Object)
62
+ + add_listener(listener: Object)
63
+ + delete_listener(listener: Object)
64
+ - notify_listeners()
65
+ }
66
+ class PublisherDBDataSource {
67
+ + get_list(limit: int, offset: int, sort_by: String, sort_order: String, father_name_filter: Boolean): Array<Publisher>
68
+ + add(item: Publisher): Publisher
69
+ + delete(id: int): void
70
+ + count(): int
71
+ }
72
+ class PublisherInputFormControllerCreate {
73
+ - parent_controller: PublisherListController
74
+ - publisher_rep: PublisherDBDataSource
75
+ - view: Object
76
+ + on_view_created()
77
+ + set_view(view: Object)
78
+ + process_fields(fields: Hash<String, String>): void
79
+ - on_db_conn_error()
80
+ }
81
+ class PublisherInputFormControllerEdit {
82
+ - parent_controller: PublisherListController
83
+ - item: Publisher
84
+ - publisher_rep: PublisherDBDataSource
85
+ - view: Object
86
+ + on_view_created()
87
+ + set_view(view: Object)
88
+ + populate_fields(item: Publisher): void
89
+ - on_db_conn_error()
90
+ }
91
+ class PublisherListView {
92
+ - PAGE_SIZE: integer = 20
93
+ - controller: PublisherListController
94
+ - current_page: integer = 1
95
+ - total_count: integer = 0
96
+ - items: Struct[]
97
+ - table: refined_table
98
+ - page_label: label
99
+ + initialize()
100
+ + on_create()
101
+ + update(publishers: Publisher[])
102
+ + update_student_count(new_cnt: integer)
103
+ + create()
104
+ }
105
+
106
+ class PublisherInputForm {
107
+ - item: Hash
108
+ - controller: PublisherInputFormControllerCreate
109
+ - entries: Hash
110
+ + initialize(controller: PublisherInputFormControllerCreate, existing_student: Publisher)
111
+ + on_create()
112
+ + create()
113
+ }
114
+
115
+
116
+
117
+
118
+ @enduml
Binary file
Binary file
@@ -0,0 +1,74 @@
1
+ @startuml
2
+ participant "main.rb" as main
3
+
4
+
5
+
6
+
7
+ boundary "mw: MainWindow" as mw
8
+ boundary "ts: AuthorListView" as ts
9
+ control "tsc: AuthorListController" as tsc
10
+ entity "dlss: ListStateNotifier" as dlss
11
+ entity "srep: AuthorDBDataSource" as srep
12
+ entity "dbsa: DBSourceAdapter" as dbsa
13
+ entity "DBClient" as dbds
14
+
15
+ database DB as db
16
+
17
+ main -> mw : <<new>>
18
+ mw -> ts : <<new>>
19
+ ts -> tsc : <<new>>(self)
20
+ tsc -> dlss : <<new>>(Array)
21
+ dlss --> tsc
22
+ tsc -> dlss : add_listener(AuthorListView)
23
+ dlss --> tsc
24
+ tsc --> ts
25
+ ts --> mw
26
+ mw --> main
27
+
28
+ main -> mw : create()
29
+ mw -> ts : create()
30
+ ts -> tsc : on_view_created()
31
+ tsc -> dbsa : <<new>>
32
+ dbsa -> dbds : <<instance>>
33
+ dbds -> dbds : <<new>>
34
+ dbds -> db : [connect]
35
+ db --> dbds
36
+ dbds --> dbsa
37
+ dbsa --> tsc
38
+ tsc -> srep : <<new>>(DBSourceAdapter)
39
+ srep --> tsc
40
+ tsc --> ts
41
+
42
+ ts -> tsc : refresh_data(Integer, Integer)
43
+ tsc -> srep : get_list(Integer, Integer, ListStateNotifier)
44
+ srep -> dbsa : get_list(Integer, Integer, ListStateNotifier)
45
+ dbsa -> dbds : prepare_exec(String, Integer, Integer)
46
+ dbds -> db : [SELECT]
47
+ db --> dbds
48
+ dbds --> dbsa
49
+ dbsa -> dlss : <<new>>(Array)
50
+ dlss --> dbsa
51
+ dbsa -> dlss : replace_objects(Array)
52
+ dlss -> ts : update(ListStateNotifier)
53
+ ts --> dlss
54
+ dlss --> dbsa
55
+ dbsa --> srep
56
+ srep --> tsc
57
+
58
+ tsc -> srep : student_count()
59
+ srep -> dbsa : student_count()
60
+ dbsa -> dbds: query(String)
61
+ dbds -> db : [SELECT]
62
+ db --> dbds
63
+ dbds --> dbsa
64
+ dbsa --> srep
65
+ srep --> tsc
66
+ tsc -> ts : update_student_count(Integer)
67
+ ts --> tsc
68
+ tsc --> ts
69
+ ts --> mw
70
+ mw --> main
71
+
72
+
73
+
74
+ @enduml