model_gem 0.1.6
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.
- checksums.yaml +7 -0
 - data/model_gem_source/attr_limited_regex_accessor.rb +43 -0
 - data/model_gem_source/controllers/create_student_controller.rb +10 -0
 - data/model_gem_source/controllers/edit_student_controller.rb +11 -0
 - data/model_gem_source/controllers/view_controller.rb +96 -0
 - data/model_gem_source/data_construct_pattern/data_construct_pattarn.rb +23 -0
 - data/model_gem_source/data_list.rb +57 -0
 - data/model_gem_source/data_list_student_short.rb +26 -0
 - data/model_gem_source/data_table.rb +19 -0
 - data/model_gem_source/database/scripts/create_table.sql +10 -0
 - data/model_gem_source/database/scripts/fill_data.sql +4 -0
 - data/model_gem_source/database/students_db.rb +75 -0
 - data/model_gem_source/database/students_list_db.rb +34 -0
 - data/model_gem_source/student/abstract_student.rb +24 -0
 - data/model_gem_source/student/student.rb +118 -0
 - data/model_gem_source/student/student_short.rb +57 -0
 - data/model_gem_source/student_list_format.rb +48 -0
 - data/model_gem_source/students_list.rb +40 -0
 - data/model_gem_source/students_list_adapter.rb +87 -0
 - data/model_gem_source/students_list_format_strategy.rb +57 -0
 - data/model_gem_source/students_tests.rb +70 -0
 - metadata +64 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: fc216b10492287ed87310ed44a72856af3406f52f12b9782a48a2b92a59f1825
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: bc1b8e97cf6bc9b848fc9dde233a99d160dfefe2163a5d9defd87169ace390e1
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 2bd894bf9273785e935270c16c75b954ae09c95ac45077f90c10f0fbd806f5023bb11dfc1874f8950ed81a709e64dd5f49895768e259ea1170a4189505142760
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: b6627b989086eac801965da333a7d119ad9a7561972ba68183781f2e860b418aee8a5e48d7347b86e79deca41d32e4f8a18746b4e739839f7b2c77db83202ca7
         
     | 
| 
         @@ -0,0 +1,43 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            def attr_limited_regex_accessor(symbol, regex)
         
     | 
| 
      
 2 
     | 
    
         
            +
                class_eval %{
         
     | 
| 
      
 3 
     | 
    
         
            +
                    def #{symbol}
         
     | 
| 
      
 4 
     | 
    
         
            +
                        @#{symbol}
         
     | 
| 
      
 5 
     | 
    
         
            +
                    end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                    def #{symbol}=(new_value)
         
     | 
| 
      
 8 
     | 
    
         
            +
                        if new_value != nil && new_value !~ #{regex}
         
     | 
| 
      
 9 
     | 
    
         
            +
                            raise "invalid #{symbol} format"
         
     | 
| 
      
 10 
     | 
    
         
            +
                        end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                        @#{symbol} = new_value
         
     | 
| 
      
 13 
     | 
    
         
            +
                    end
         
     | 
| 
      
 14 
     | 
    
         
            +
                }
         
     | 
| 
      
 15 
     | 
    
         
            +
            end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            def attr_private_limited_regex_accessor(symbol, regex)
         
     | 
| 
      
 18 
     | 
    
         
            +
                class_eval %{
         
     | 
| 
      
 19 
     | 
    
         
            +
                    def #{symbol}
         
     | 
| 
      
 20 
     | 
    
         
            +
                        @#{symbol}
         
     | 
| 
      
 21 
     | 
    
         
            +
                    end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                    private def #{symbol}=(new_value)
         
     | 
| 
      
 24 
     | 
    
         
            +
                        if new_value != nil && new_value !~ #{regex}
         
     | 
| 
      
 25 
     | 
    
         
            +
                            raise "invalid #{symbol} format"
         
     | 
| 
      
 26 
     | 
    
         
            +
                        end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                        @#{symbol} = new_value
         
     | 
| 
      
 29 
     | 
    
         
            +
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
                }
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            def attr_private_accessor(symbol)
         
     | 
| 
      
 34 
     | 
    
         
            +
                class_eval %{
         
     | 
| 
      
 35 
     | 
    
         
            +
                    private def #{symbol}
         
     | 
| 
      
 36 
     | 
    
         
            +
                        @#{symbol}
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                    private def #{symbol}=(new_value)
         
     | 
| 
      
 40 
     | 
    
         
            +
                        @#{symbol} = new_value
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
                }
         
     | 
| 
      
 43 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,96 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative './../../data_construct_pattern/data_construct_pattarn.rb'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative './main_view.rb'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative './../create_student_window/create_student_controller.rb'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative './../create_student_window/edit_student_controller.rb'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class ViewController
         
     | 
| 
      
 7 
     | 
    
         
            +
                attr_private_accessor :model
         
     | 
| 
      
 8 
     | 
    
         
            +
                attr_private_accessor :view
         
     | 
| 
      
 9 
     | 
    
         
            +
                attr_private_accessor :data_list
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                attr_accessor :selected_page
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def initialize(model)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    self.model = model
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                    self.selected_page = 0
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                    self.data_list = DataListStudentShort.new(list: [], data_constructor: DefaultDataConstructPattern.new())
         
     | 
| 
      
 19 
     | 
    
         
            +
                    self.model.get_students(0, 10, self.data_list)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                    self.view = MainView.new(self)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    self.data_list.add_observer(self.view.filter_tab)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                    update_table()
         
     | 
| 
      
 25 
     | 
    
         
            +
                    
         
     | 
| 
      
 26 
     | 
    
         
            +
                    self.view.window_view.open
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            # StudentsListViewDelegate
         
     | 
| 
      
 32 
     | 
    
         
            +
            class ViewController 
         
     | 
| 
      
 33 
     | 
    
         
            +
                def pages_count
         
     | 
| 
      
 34 
     | 
    
         
            +
                    (model.count / 10.0).ceil
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                def table_columns
         
     | 
| 
      
 38 
     | 
    
         
            +
                    self.data_list.get_names
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                def next_page
         
     | 
| 
      
 42 
     | 
    
         
            +
                    if self.selected_page != self.pages_count - 1
         
     | 
| 
      
 43 
     | 
    
         
            +
                        self.selected_page += 1
         
     | 
| 
      
 44 
     | 
    
         
            +
                    end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                    puts self.selected_page
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                    update_table()
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                def last_page
         
     | 
| 
      
 52 
     | 
    
         
            +
                    if self.selected_page != 0
         
     | 
| 
      
 53 
     | 
    
         
            +
                        self.selected_page -= 1
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                    puts self.selected_page
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                    
         
     | 
| 
      
 59 
     | 
    
         
            +
                    update_table()
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                def update_table
         
     | 
| 
      
 63 
     | 
    
         
            +
                    model.get_students(self.selected_page * 10, (self.selected_page + 1) * 10, self.data_list)
         
     | 
| 
      
 64 
     | 
    
         
            +
                    self.view.filter_tab.next_page_button.enabled = self.selected_page != self.pages_count - 1
         
     | 
| 
      
 65 
     | 
    
         
            +
                    self.view.filter_tab.last_page_button.enabled = self.selected_page != 0
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                    self.view.filter_tab.table_title.text = (self.selected_page + 1).to_s + " из " + self.pages_count.to_s
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                def open_student_creation_window()
         
     | 
| 
      
 71 
     | 
    
         
            +
                    controller = CreateStudentController.new()
         
     | 
| 
      
 72 
     | 
    
         
            +
                    controller.onCreate = lambda { |student|
         
     | 
| 
      
 73 
     | 
    
         
            +
                        puts student
         
     | 
| 
      
 74 
     | 
    
         
            +
                        model.add_student(student)
         
     | 
| 
      
 75 
     | 
    
         
            +
                        update_table()
         
     | 
| 
      
 76 
     | 
    
         
            +
                    }
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                    controller.ui.present
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                def open_student_editing_window(id)
         
     | 
| 
      
 82 
     | 
    
         
            +
                    student = model.get_student(id)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    controller = EditStudentController.new(student)
         
     | 
| 
      
 84 
     | 
    
         
            +
                    controller.onCreate = lambda { |student|
         
     | 
| 
      
 85 
     | 
    
         
            +
                        model.replace_student(controller.edit_user_id, student)
         
     | 
| 
      
 86 
     | 
    
         
            +
                        update_table()
         
     | 
| 
      
 87 
     | 
    
         
            +
                    }
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                    controller.ui.present
         
     | 
| 
      
 90 
     | 
    
         
            +
                end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                def remove_student(id)
         
     | 
| 
      
 93 
     | 
    
         
            +
                    model.remove_student(id)
         
     | 
| 
      
 94 
     | 
    
         
            +
                    update_table()
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class DataConstructPattern 
         
     | 
| 
      
 2 
     | 
    
         
            +
                def execute(values, attrs)
         
     | 
| 
      
 3 
     | 
    
         
            +
                    raise 'Метод не реализован'
         
     | 
| 
      
 4 
     | 
    
         
            +
                end
         
     | 
| 
      
 5 
     | 
    
         
            +
            end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            class DefaultDataConstructPattern 
         
     | 
| 
      
 8 
     | 
    
         
            +
                def execute(values, attrs)
         
     | 
| 
      
 9 
     | 
    
         
            +
                    (0...values.size).map { |item_index|
         
     | 
| 
      
 10 
     | 
    
         
            +
                        [
         
     | 
| 
      
 11 
     | 
    
         
            +
                            values[item_index].id,
         
     | 
| 
      
 12 
     | 
    
         
            +
                            values[item_index].lastname,
         
     | 
| 
      
 13 
     | 
    
         
            +
                            values[item_index].firstname,
         
     | 
| 
      
 14 
     | 
    
         
            +
                            values[item_index].patronymic,
         
     | 
| 
      
 15 
     | 
    
         
            +
                            values[item_index].git,
         
     | 
| 
      
 16 
     | 
    
         
            +
                            values[item_index].telegram,
         
     | 
| 
      
 17 
     | 
    
         
            +
                            values[item_index].phone,
         
     | 
| 
      
 18 
     | 
    
         
            +
                            values[item_index].email
         
     | 
| 
      
 19 
     | 
    
         
            +
                        ]
         
     | 
| 
      
 20 
     | 
    
         
            +
                    }
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module DataListObserver
         
     | 
| 
      
 2 
     | 
    
         
            +
                def notify(data)
         
     | 
| 
      
 3 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 4 
     | 
    
         
            +
                end
         
     | 
| 
      
 5 
     | 
    
         
            +
            end
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module DataListNotifier
         
     | 
| 
      
 8 
     | 
    
         
            +
                attr_accessor :data_list_observers
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def notify
         
     | 
| 
      
 11 
     | 
    
         
            +
                    raise 'not implemented'
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
            end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            class DataList 
         
     | 
| 
      
 16 
     | 
    
         
            +
                attr_accessor :list
         
     | 
| 
      
 17 
     | 
    
         
            +
                attr_private_accessor :selected_objects
         
     | 
| 
      
 18 
     | 
    
         
            +
                def initialize(list:)
         
     | 
| 
      
 19 
     | 
    
         
            +
                    self.data_list_observers = []
         
     | 
| 
      
 20 
     | 
    
         
            +
                    self.list = list
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def select(index)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    selected_objects << index
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def get_selected_objects
         
     | 
| 
      
 28 
     | 
    
         
            +
                    (0...list.size)
         
     | 
| 
      
 29 
     | 
    
         
            +
                        .filter { |x| selected_objects.include? x }
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                def get_names
         
     | 
| 
      
 33 
     | 
    
         
            +
                    raise "Метод не реализован"
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                def get_data
         
     | 
| 
      
 37 
     | 
    
         
            +
                    raise "Метод не реализован"
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            class DataList
         
     | 
| 
      
 42 
     | 
    
         
            +
                include DataListNotifier
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                def notify
         
     | 
| 
      
 45 
     | 
    
         
            +
                    data_list_observers.each { |observer|
         
     | 
| 
      
 46 
     | 
    
         
            +
                        observer.notify(self.get_data)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    }
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                def add_observer(observer)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    self.data_list_observers << observer
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                def remove_observer(observer)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    self.data_list_observers.delete(observer) 
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative './data_list.rb'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative './data_table.rb'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            class DataListStudentShort < DataList 
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                attr_private_accessor :data_constructor
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                def initialize(list:, data_constructor:) 
         
     | 
| 
      
 9 
     | 
    
         
            +
                    self.data_constructor = data_constructor
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                    super(list: list)
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def get_names
         
     | 
| 
      
 15 
     | 
    
         
            +
                    ["ID", "Фамилия", "Имя", "Отчество", "Гит", "Телега", "Телефон", "Почта"]
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def get_data 
         
     | 
| 
      
 19 
     | 
    
         
            +
                    self.data_constructor.execute(list, get_names)
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                def list=(new_list)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    @list = new_list
         
     | 
| 
      
 24 
     | 
    
         
            +
                    notify()
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class DataTable
         
     | 
| 
      
 2 
     | 
    
         
            +
                attr_private_accessor :data
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
                def initialize(data:)
         
     | 
| 
      
 5 
     | 
    
         
            +
                    self.data = data
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                def element(row:, column:)
         
     | 
| 
      
 9 
     | 
    
         
            +
                    data[row][column]
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                def columnsCount 
         
     | 
| 
      
 13 
     | 
    
         
            +
                    data[0].size
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                def rowsCount
         
     | 
| 
      
 17 
     | 
    
         
            +
                    data.size
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,4 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            INSERT INTO student (lastname, firstname, patronymic, git, phone, email, telegram) VALUES
         
     | 
| 
      
 2 
     | 
    
         
            +
            ROW("Хахук", "Рустам", "Нальбиевич", "@Null-Delta", NULL, NULL, NULL),
         
     | 
| 
      
 3 
     | 
    
         
            +
            ROW("Нагалевский", "Артем", "Михайлович", "@Jakeapps", "+7-800-555-35-35", NULL, NULL),
         
     | 
| 
      
 4 
     | 
    
         
            +
            ROW("Гиренко", "Даниил", "Евгениевич", "@iamgirya", NULL, "iamgirya@yandex.ru", NULL)
         
     | 
| 
         @@ -0,0 +1,75 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'mysql2'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class StudentsDB
         
     | 
| 
      
 4 
     | 
    
         
            +
                attr_private_accessor :db_connection
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                def initialize()
         
     | 
| 
      
 7 
     | 
    
         
            +
                    self.db_connection = Mysql2::Client.new(:host => "localhost", :username => "root")
         
     | 
| 
      
 8 
     | 
    
         
            +
                    self.db_connection.query('CREATE DATABASE IF NOT EXISTS my_db')
         
     | 
| 
      
 9 
     | 
    
         
            +
                    self.db_connection.query('USE my_db')
         
     | 
| 
      
 10 
     | 
    
         
            +
                    self.db_connection.query('DROP TABLE IF EXISTS student')
         
     | 
| 
      
 11 
     | 
    
         
            +
                    self.db_connection.query(File.read('database/scripts/create_table.sql'))
         
     | 
| 
      
 12 
     | 
    
         
            +
                    self.fill_data()
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                private def fill_data()
         
     | 
| 
      
 16 
     | 
    
         
            +
                    db_connection.query(File.read('database/scripts/fill_data.sql'))
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def select_by_id(id)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    db_connection.query("SELECT * FROM student WHERE id = #{id}").map { |x| x }[0]
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def remove_by_id(id)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    db_connection.query("DELETE FROM student WHERE id = #{id}")
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def replace_by_id(id, student_json)
         
     | 
| 
      
 28 
     | 
    
         
            +
                    db_connection.query("DELETE FROM student WHERE id = #{id}")
         
     | 
| 
      
 29 
     | 
    
         
            +
                    db_connection.query("""
         
     | 
| 
      
 30 
     | 
    
         
            +
                        INSERT INTO student (id, lastname, firstname, patronymic, git, phone, email, telegram) VALUES
         
     | 
| 
      
 31 
     | 
    
         
            +
                        ROW(
         
     | 
| 
      
 32 
     | 
    
         
            +
                            \"#{id}\",
         
     | 
| 
      
 33 
     | 
    
         
            +
                            \"#{attr_or_null(student_json[:lastname])}\",
         
     | 
| 
      
 34 
     | 
    
         
            +
                            \"#{attr_or_null(student_json[:firstname])}\",
         
     | 
| 
      
 35 
     | 
    
         
            +
                            \"#{attr_or_null(student_json[:patronymic])}\", 
         
     | 
| 
      
 36 
     | 
    
         
            +
                            \"#{attr_or_null(student_json[:git])}\", 
         
     | 
| 
      
 37 
     | 
    
         
            +
                            \"#{attr_or_null(student_json[:phone])}\",
         
     | 
| 
      
 38 
     | 
    
         
            +
                            \"#{attr_or_null(student_json[:email])}\",
         
     | 
| 
      
 39 
     | 
    
         
            +
                            \"#{attr_or_null(student_json[:telegram])}\"
         
     | 
| 
      
 40 
     | 
    
         
            +
                        )
         
     | 
| 
      
 41 
     | 
    
         
            +
                        """)
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                def add_student(student_json)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    puts student_json[:lastname]
         
     | 
| 
      
 46 
     | 
    
         
            +
                    db_connection.query("""
         
     | 
| 
      
 47 
     | 
    
         
            +
                    INSERT INTO student (lastname, firstname, patronymic, git, phone, email, telegram) VALUES
         
     | 
| 
      
 48 
     | 
    
         
            +
                    ROW(
         
     | 
| 
      
 49 
     | 
    
         
            +
                        \"#{attr_or_null(student_json[:lastname])}\",
         
     | 
| 
      
 50 
     | 
    
         
            +
                        \"#{attr_or_null(student_json[:firstname])}\",
         
     | 
| 
      
 51 
     | 
    
         
            +
                        \"#{attr_or_null(student_json[:patronymic])}\", 
         
     | 
| 
      
 52 
     | 
    
         
            +
                        \"#{attr_or_null(student_json[:git])}\", 
         
     | 
| 
      
 53 
     | 
    
         
            +
                        \"#{attr_or_null(student_json[:phone])}\",
         
     | 
| 
      
 54 
     | 
    
         
            +
                        \"#{attr_or_null(student_json[:email])}\",
         
     | 
| 
      
 55 
     | 
    
         
            +
                        \"#{attr_or_null(student_json[:telegram])}\"
         
     | 
| 
      
 56 
     | 
    
         
            +
                    )
         
     | 
| 
      
 57 
     | 
    
         
            +
                    """)
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                def select_students(from, to)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    db_connection.query("SELECT * FROM student LIMIT #{from}, #{to}")
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                def count()
         
     | 
| 
      
 65 
     | 
    
         
            +
                    db_connection.query("SELECT * FROM student").count
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                private def attr_or_null(attr) 
         
     | 
| 
      
 69 
     | 
    
         
            +
                    if attr == nil
         
     | 
| 
      
 70 
     | 
    
         
            +
                        "NULL"
         
     | 
| 
      
 71 
     | 
    
         
            +
                    else
         
     | 
| 
      
 72 
     | 
    
         
            +
                        attr
         
     | 
| 
      
 73 
     | 
    
         
            +
                    end
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative './students_db.rb'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class StudentsListDB    
         
     | 
| 
      
 4 
     | 
    
         
            +
                private_class_method :new
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                def self.get_student(id)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    Student.from_json(StudentsListDB.database.select_by_id(id))
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def self.remove_student(id)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    StudentsListDB.database.remove_by_id(id)
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def self.replace_student(id, student)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    StudentsListDB.database.replace_by_id(id, student.as_json)
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def self.add_student(student)
         
     | 
| 
      
 19 
     | 
    
         
            +
                    StudentsListDB.database.add_student(student.as_json)
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                def self.get_students_slice(from, to)
         
     | 
| 
      
 23 
     | 
    
         
            +
                    StudentsListDB.database.select_students(from, to).map { |x| Student.from_json(x) }
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def self.count()
         
     | 
| 
      
 27 
     | 
    
         
            +
                    StudentsListDB.database.count()
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                def self.database
         
     | 
| 
      
 31 
     | 
    
         
            +
                    @database ||= StudentsDB.new()
         
     | 
| 
      
 32 
     | 
    
         
            +
                    @database
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,24 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class AbstractStudent
         
     | 
| 
      
 2 
     | 
    
         
            +
                private_class_method :new
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_accessor :lastname, :firstname, :patronymic, :id
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def get_info
         
     | 
| 
      
 6 
     | 
    
         
            +
                    raise "method not implemented"
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def fio_info
         
     | 
| 
      
 10 
     | 
    
         
            +
                    raise "method not implemented"
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def contacts_info
         
     | 
| 
      
 14 
     | 
    
         
            +
                    raise "method not implemented"
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def to_s
         
     | 
| 
      
 18 
     | 
    
         
            +
                    get_info
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def as_json 
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,118 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative "../attr_limited_regex_accessor.rb"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative "./abstract_student.rb"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            class Student < AbstractStudent    
         
     | 
| 
      
 5 
     | 
    
         
            +
                attr_limited_regex_accessor :phone, '/\d-\d{3}-\d{3}-\d{2}-\d{2}/'
         
     | 
| 
      
 6 
     | 
    
         
            +
                attr_limited_regex_accessor :email, '/\w*@\w*.\w{2,3}/'
         
     | 
| 
      
 7 
     | 
    
         
            +
                attr_limited_regex_accessor :telegram, '/@\w*/'
         
     | 
| 
      
 8 
     | 
    
         
            +
                attr_limited_regex_accessor :git, '/@\w*/'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                public_class_method :new
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                def initialize(
         
     | 
| 
      
 13 
     | 
    
         
            +
                    lastname:,
         
     | 
| 
      
 14 
     | 
    
         
            +
                    firstname:,
         
     | 
| 
      
 15 
     | 
    
         
            +
                    patronymic:,
         
     | 
| 
      
 16 
     | 
    
         
            +
                    params: {}
         
     | 
| 
      
 17 
     | 
    
         
            +
                )
         
     | 
| 
      
 18 
     | 
    
         
            +
                    self.lastname = lastname
         
     | 
| 
      
 19 
     | 
    
         
            +
                    self.firstname = firstname
         
     | 
| 
      
 20 
     | 
    
         
            +
                    self.patronymic = patronymic
         
     | 
| 
      
 21 
     | 
    
         
            +
                    self.id = params[:id]
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                    self.phone = params[:phone]
         
     | 
| 
      
 24 
     | 
    
         
            +
                    self.telegram = params[:telegram]
         
     | 
| 
      
 25 
     | 
    
         
            +
                    self.email = params[:email]
         
     | 
| 
      
 26 
     | 
    
         
            +
                    self.git = params[:git]
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    validate()
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                def self.from_json(json)
         
     | 
| 
      
 32 
     | 
    
         
            +
                    params = json.map { |v| 
         
     | 
| 
      
 33 
     | 
    
         
            +
                        [v[0].to_sym, v[1]]
         
     | 
| 
      
 34 
     | 
    
         
            +
                    }.filter { |v|
         
     | 
| 
      
 35 
     | 
    
         
            +
                        v[1] != "NULL"
         
     | 
| 
      
 36 
     | 
    
         
            +
                    }.to_h
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    Student.new(
         
     | 
| 
      
 39 
     | 
    
         
            +
                        lastname: json["lastname"],
         
     | 
| 
      
 40 
     | 
    
         
            +
                        firstname: json["firstname"],
         
     | 
| 
      
 41 
     | 
    
         
            +
                        patronymic: json["patronymic"],
         
     | 
| 
      
 42 
     | 
    
         
            +
                        params: params
         
     | 
| 
      
 43 
     | 
    
         
            +
                    )
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                def self.from_string(str)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    params = str
         
     | 
| 
      
 48 
     | 
    
         
            +
                    .split(";")
         
     | 
| 
      
 49 
     | 
    
         
            +
                    .map { |x| x.split(":") }
         
     | 
| 
      
 50 
     | 
    
         
            +
                    .map { |x| [x[0].to_sym, x[1]] }
         
     | 
| 
      
 51 
     | 
    
         
            +
                    .to_h
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                    if params[:fio] == nil
         
     | 
| 
      
 54 
     | 
    
         
            +
                        raise "invalid string representation"
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                    fio_components = params[:fio].split(" ")
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                    Student.new(
         
     | 
| 
      
 60 
     | 
    
         
            +
                        lastname: fio_components[0],
         
     | 
| 
      
 61 
     | 
    
         
            +
                        firstname: fio_components[1],
         
     | 
| 
      
 62 
     | 
    
         
            +
                        patronymic: fio_components[2],
         
     | 
| 
      
 63 
     | 
    
         
            +
                        params: params
         
     | 
| 
      
 64 
     | 
    
         
            +
                    )
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
                def have_any_contact
         
     | 
| 
      
 68 
     | 
    
         
            +
                    phone != nil || telegram  != nil || email != nil || git != nil
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                def validate
         
     | 
| 
      
 72 
     | 
    
         
            +
                    if !have_any_contact 
         
     | 
| 
      
 73 
     | 
    
         
            +
                        raise "Not finded git or any contact"
         
     | 
| 
      
 74 
     | 
    
         
            +
                    end
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                def set_contacts(phone: nil, email: nil, git: nil, telegram: nil)
         
     | 
| 
      
 78 
     | 
    
         
            +
                    if phone != nil then self.phone = phone end
         
     | 
| 
      
 79 
     | 
    
         
            +
                    if email != nil then self.email = email end
         
     | 
| 
      
 80 
     | 
    
         
            +
                    if git != nil then self.git = git end
         
     | 
| 
      
 81 
     | 
    
         
            +
                    if telegram != nil then self.telegram = telegram end
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                def contacts_info
         
     | 
| 
      
 85 
     | 
    
         
            +
                    contacts = ""
         
     | 
| 
      
 86 
     | 
    
         
            +
                    if git != nil then contacts << "git:#{git};" end
         
     | 
| 
      
 87 
     | 
    
         
            +
                    if phone != nil then contacts << "phone:#{phone};" end
         
     | 
| 
      
 88 
     | 
    
         
            +
                    if email != nil then contacts << "email:#{email};" end
         
     | 
| 
      
 89 
     | 
    
         
            +
                    if telegram != nil then contacts << "telegram:#{telegram};" end
         
     | 
| 
      
 90 
     | 
    
         
            +
                    
         
     | 
| 
      
 91 
     | 
    
         
            +
                    contacts
         
     | 
| 
      
 92 
     | 
    
         
            +
                end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
                def get_info
         
     | 
| 
      
 95 
     | 
    
         
            +
                    if id != nil
         
     | 
| 
      
 96 
     | 
    
         
            +
                        "id:#{id};#{fio_info};#{contacts_info}"
         
     | 
| 
      
 97 
     | 
    
         
            +
                    else 
         
     | 
| 
      
 98 
     | 
    
         
            +
                        "#{fio_info};#{contacts_info}"
         
     | 
| 
      
 99 
     | 
    
         
            +
                    end
         
     | 
| 
      
 100 
     | 
    
         
            +
                end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                def fio_info
         
     | 
| 
      
 103 
     | 
    
         
            +
                    "fio:#{lastname} #{firstname} #{patronymic}"
         
     | 
| 
      
 104 
     | 
    
         
            +
                end
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
                def as_json 
         
     | 
| 
      
 107 
     | 
    
         
            +
                    {
         
     | 
| 
      
 108 
     | 
    
         
            +
                        lastname: lastname,
         
     | 
| 
      
 109 
     | 
    
         
            +
                        firstname: firstname,
         
     | 
| 
      
 110 
     | 
    
         
            +
                        patronymic: patronymic,
         
     | 
| 
      
 111 
     | 
    
         
            +
                        id: id,
         
     | 
| 
      
 112 
     | 
    
         
            +
                        phone: phone,
         
     | 
| 
      
 113 
     | 
    
         
            +
                        email: email,
         
     | 
| 
      
 114 
     | 
    
         
            +
                        git: git,
         
     | 
| 
      
 115 
     | 
    
         
            +
                        telegram: telegram
         
     | 
| 
      
 116 
     | 
    
         
            +
                    }
         
     | 
| 
      
 117 
     | 
    
         
            +
                end
         
     | 
| 
      
 118 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative "../attr_limited_regex_accessor.rb"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative "./abstract_student.rb"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            class StudentShort < AbstractStudent
         
     | 
| 
      
 5 
     | 
    
         
            +
                attr_private_limited_regex_accessor :git, '/@\w*/'
         
     | 
| 
      
 6 
     | 
    
         
            +
                attr_private_limited_regex_accessor :email, '/\w*@\w*.\w{2,3}/'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                public_class_method :new
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize(id:, fio:, git:, email:)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    fio_components = fio.split(" ")
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                    self.id = id
         
     | 
| 
      
 14 
     | 
    
         
            +
                    self.firstname = fio_components[0]
         
     | 
| 
      
 15 
     | 
    
         
            +
                    self.lastname = fio_components[1]
         
     | 
| 
      
 16 
     | 
    
         
            +
                    self.patronymic = fio_components[2]
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                    self.git = git
         
     | 
| 
      
 19 
     | 
    
         
            +
                    self.email = email
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                def self.from_student(student) 
         
     | 
| 
      
 23 
     | 
    
         
            +
                    StudentShort.new(
         
     | 
| 
      
 24 
     | 
    
         
            +
                        id: student.id, 
         
     | 
| 
      
 25 
     | 
    
         
            +
                        fio: "#{student.firstname} #{student.lastname} #{student.patronymic}",
         
     | 
| 
      
 26 
     | 
    
         
            +
                        git: student.git,
         
     | 
| 
      
 27 
     | 
    
         
            +
                        email: student.email
         
     | 
| 
      
 28 
     | 
    
         
            +
                    )
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                def self.from_string(id, info) 
         
     | 
| 
      
 32 
     | 
    
         
            +
                    params = info
         
     | 
| 
      
 33 
     | 
    
         
            +
                    .split(";")
         
     | 
| 
      
 34 
     | 
    
         
            +
                    .map { |x| x.split(":") }
         
     | 
| 
      
 35 
     | 
    
         
            +
                    .map { |x| [x[0].to_sym, x[1]] }
         
     | 
| 
      
 36 
     | 
    
         
            +
                    .to_h
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    StudentShort.new(
         
     | 
| 
      
 39 
     | 
    
         
            +
                        id: id, 
         
     | 
| 
      
 40 
     | 
    
         
            +
                        fio: params[:fio],
         
     | 
| 
      
 41 
     | 
    
         
            +
                        git: params[:git],
         
     | 
| 
      
 42 
     | 
    
         
            +
                        email: params[:email]
         
     | 
| 
      
 43 
     | 
    
         
            +
                    )
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                def fio_info
         
     | 
| 
      
 47 
     | 
    
         
            +
                    "fio:#{firstname} #{lastname.upcase[0]} #{patronymic.upcase[0]}"
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                def contacts_info
         
     | 
| 
      
 51 
     | 
    
         
            +
                    "git:#{git};email:#{email}"
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                def get_info
         
     | 
| 
      
 55 
     | 
    
         
            +
                    [fio_info, contacts_info].join(";")
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,48 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class StudentListFormat
         
     | 
| 
      
 2 
     | 
    
         
            +
                attr_private_accessor :students
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_accessor :formater
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def initialize(formater)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    self.formater = formater
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def read_from(filename)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    self.students = formater.read_from(filename)
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def write_to(filename)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    formater.write_to(filename, self.students)
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def get_student(id)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    self.students.detect { |x|
         
     | 
| 
      
 19 
     | 
    
         
            +
                        x.id == id .to_s
         
     | 
| 
      
 20 
     | 
    
         
            +
                    }
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def add_student(student)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    self.students << student
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def delete_student(id)
         
     | 
| 
      
 28 
     | 
    
         
            +
                    index = students.index(students.detect { |x| x.id == id.to_s })
         
     | 
| 
      
 29 
     | 
    
         
            +
                    self.students.delete_at(index)
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                def replace_student(id, student)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    self.students.map! { |x| x.id == id.to_s ? student : x }
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                def get_students_slice(k, count)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    from = [k * count, self.students.count].min
         
     | 
| 
      
 38 
     | 
    
         
            +
                    to = [self.students.count, from + count].min
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                def count()
         
     | 
| 
      
 42 
     | 
    
         
            +
                    self.students.count
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                def sort()
         
     | 
| 
      
 46 
     | 
    
         
            +
                    self.students.sort_by(&:fio_info)
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,40 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require_relative "./attr_limited_regex_accessor.rb"
         
     | 
| 
      
 2 
     | 
    
         
            +
            class StudentsList 
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_private_accessor :students_list_adapter
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def initialize(adapter)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    self.students_list_adapter = adapter
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def get_student(id)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    students_list_adapter.get_student(id)
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def remove_student(id)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    students_list_adapter.remove_student(id)
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def replace_student(id, student)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    students_list_adapter.replace_student(id, student)
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def get_students(from, to, data)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    values = students_list_adapter.get_students(from, to)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                    if data == nil
         
     | 
| 
      
 25 
     | 
    
         
            +
                        data = DataList.new(list: values)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    else
         
     | 
| 
      
 27 
     | 
    
         
            +
                        data.list = values
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                    data.list
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                def add_student(student)
         
     | 
| 
      
 34 
     | 
    
         
            +
                    students_list_adapter.add_student(student)
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                def count
         
     | 
| 
      
 38 
     | 
    
         
            +
                    students_list_adapter.count()
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,87 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class StudentsListAdapter 
         
     | 
| 
      
 2 
     | 
    
         
            +
                def get_student(id)
         
     | 
| 
      
 3 
     | 
    
         
            +
                end
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def remove_student(id)
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                def replace_student(id, student, data)
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def get_students(from, to, data)
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                def add_student(student)
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def count
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            class StudentsListDBAdapter < StudentsListAdapter
         
     | 
| 
      
 22 
     | 
    
         
            +
                attr_private_accessor :database_list
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                def initialize(database_list)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    self.database_list = database_list
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                def get_student(id)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    database_list.get_student(id)
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                def remove_student(id)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    database_list.remove_student(id)
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                def replace_student(id, student)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    database_list.replace_student(id, student)
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                def get_students(from, to)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    database_list.get_students_slice(from, to)
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                def add_student(student)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    database_list.add_student(student)
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                def count
         
     | 
| 
      
 49 
     | 
    
         
            +
                    database_list.count()
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            class StudentsListFormatterAdapter < StudentsListAdapter
         
     | 
| 
      
 54 
     | 
    
         
            +
                attr_private_accessor :formatter
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                def initialize(formatter, filename)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    self.formatter = formatter
         
     | 
| 
      
 58 
     | 
    
         
            +
                    formatter.read_from(filename)
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                def get_student(id)
         
     | 
| 
      
 62 
     | 
    
         
            +
                    formatter.get_student(id)
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                def remove_student(id)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    formatter.delete_student(id)
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                def replace_student(id, student)
         
     | 
| 
      
 70 
     | 
    
         
            +
                    formatter.replace_student(id, student)
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                def get_students(from, to)
         
     | 
| 
      
 74 
     | 
    
         
            +
                    count = to - from
         
     | 
| 
      
 75 
     | 
    
         
            +
                    k = from / count
         
     | 
| 
      
 76 
     | 
    
         
            +
                    
         
     | 
| 
      
 77 
     | 
    
         
            +
                    formatter.get_students_slice(k, count)
         
     | 
| 
      
 78 
     | 
    
         
            +
                end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                def add_student(student)
         
     | 
| 
      
 81 
     | 
    
         
            +
                    formatter.add_student(student)
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                def count
         
     | 
| 
      
 85 
     | 
    
         
            +
                    formatter.count()
         
     | 
| 
      
 86 
     | 
    
         
            +
                end
         
     | 
| 
      
 87 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'json'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'yaml'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            class StudentsListFormatStrategy
         
     | 
| 
      
 5 
     | 
    
         
            +
                def read_from(filename)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    require 'method not implemented'
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def write_to(filename, students)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    require 'method not implemented'
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
            end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            class TxtStudentsListFormatStrategy < StudentsListFormatStrategy
         
     | 
| 
      
 15 
     | 
    
         
            +
                def read_from(filename)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    File.read(filename)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    .split("\n")
         
     | 
| 
      
 18 
     | 
    
         
            +
                    .map { |v| Student.from_string(v) }
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def write_to(filename, students)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    File.open(filename, 'w') { |file| 
         
     | 
| 
      
 23 
     | 
    
         
            +
                        file.write(
         
     | 
| 
      
 24 
     | 
    
         
            +
                            students.map { |student| 
         
     | 
| 
      
 25 
     | 
    
         
            +
                                student.get_info
         
     | 
| 
      
 26 
     | 
    
         
            +
                            }
         
     | 
| 
      
 27 
     | 
    
         
            +
                            .join("\n")
         
     | 
| 
      
 28 
     | 
    
         
            +
                        )
         
     | 
| 
      
 29 
     | 
    
         
            +
                    }
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            class JsonStudentsListFormatStrategy < StudentsListFormatStrategy
         
     | 
| 
      
 34 
     | 
    
         
            +
                def read_from(filename)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    file = File.read(filename)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    json = JSON.parse(file)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    json.map { |x| Student.from_json(x) }
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                def write_to(filename, students)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    File.open(filename, 'w') do |f|
         
     | 
| 
      
 42 
     | 
    
         
            +
                        f.write(JSON.generate(students.map { |x| x.as_json }))
         
     | 
| 
      
 43 
     | 
    
         
            +
                    end
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            class YamlStudentsListFormatStrategy < StudentsListFormatStrategy
         
     | 
| 
      
 48 
     | 
    
         
            +
                def read_from(filename)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    YAML.load_file(filename)
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
                
         
     | 
| 
      
 52 
     | 
    
         
            +
                def write_to(filename, students)
         
     | 
| 
      
 53 
     | 
    
         
            +
                    File.open(filename, 'w') do |file|
         
     | 
| 
      
 54 
     | 
    
         
            +
                        file.write(students.to_yaml)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,70 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "test/unit"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require_relative "./students_list.rb"
         
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative "./attr_limited_regex_accessor.rb"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative "./students_list_adapter.rb"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative "./database/students_list_db.rb"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative "./student/student.rb"
         
     | 
| 
      
 7 
     | 
    
         
            +
            require_relative "./data_list.rb"
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            class StudentsTests < Test::Unit::TestCase
         
     | 
| 
      
 10 
     | 
    
         
            +
                def test_add
         
     | 
| 
      
 11 
     | 
    
         
            +
                    @students = StudentsList.new(
         
     | 
| 
      
 12 
     | 
    
         
            +
                        StudentsListDBAdapter.new(
         
     | 
| 
      
 13 
     | 
    
         
            +
                            StudentsListDB
         
     | 
| 
      
 14 
     | 
    
         
            +
                        )
         
     | 
| 
      
 15 
     | 
    
         
            +
                    )
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                    @start_count = @students.count
         
     | 
| 
      
 18 
     | 
    
         
            +
                    
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @students.add_student(
         
     | 
| 
      
 20 
     | 
    
         
            +
                        Student.new(
         
     | 
| 
      
 21 
     | 
    
         
            +
                            lastname: "AAA",
         
     | 
| 
      
 22 
     | 
    
         
            +
                            firstname: "BBB",
         
     | 
| 
      
 23 
     | 
    
         
            +
                            patronymic: "CCC",
         
     | 
| 
      
 24 
     | 
    
         
            +
                            params: {
         
     | 
| 
      
 25 
     | 
    
         
            +
                                email: "test@email.com"
         
     | 
| 
      
 26 
     | 
    
         
            +
                            }
         
     | 
| 
      
 27 
     | 
    
         
            +
                        )    
         
     | 
| 
      
 28 
     | 
    
         
            +
                    )
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                    assert_equal(1, @students.count - @start_count)
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                def test_delete
         
     | 
| 
      
 34 
     | 
    
         
            +
                    @students = StudentsList.new(
         
     | 
| 
      
 35 
     | 
    
         
            +
                        StudentsListDBAdapter.new(
         
     | 
| 
      
 36 
     | 
    
         
            +
                            StudentsListDB
         
     | 
| 
      
 37 
     | 
    
         
            +
                        )
         
     | 
| 
      
 38 
     | 
    
         
            +
                    )
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                    @students.add_student(
         
     | 
| 
      
 41 
     | 
    
         
            +
                        Student.new(
         
     | 
| 
      
 42 
     | 
    
         
            +
                            lastname: "AAA",
         
     | 
| 
      
 43 
     | 
    
         
            +
                            firstname: "BBB",
         
     | 
| 
      
 44 
     | 
    
         
            +
                            patronymic: "CCC",
         
     | 
| 
      
 45 
     | 
    
         
            +
                            params: {
         
     | 
| 
      
 46 
     | 
    
         
            +
                                email: "test@email.com"
         
     | 
| 
      
 47 
     | 
    
         
            +
                            }
         
     | 
| 
      
 48 
     | 
    
         
            +
                        )    
         
     | 
| 
      
 49 
     | 
    
         
            +
                    )
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                    @students.add_student(
         
     | 
| 
      
 52 
     | 
    
         
            +
                        Student.new(
         
     | 
| 
      
 53 
     | 
    
         
            +
                            lastname: "AAA",
         
     | 
| 
      
 54 
     | 
    
         
            +
                            firstname: "BBB",
         
     | 
| 
      
 55 
     | 
    
         
            +
                            patronymic: "CCC",
         
     | 
| 
      
 56 
     | 
    
         
            +
                            params: {
         
     | 
| 
      
 57 
     | 
    
         
            +
                                email: "test@email.com"
         
     | 
| 
      
 58 
     | 
    
         
            +
                            }
         
     | 
| 
      
 59 
     | 
    
         
            +
                        )    
         
     | 
| 
      
 60 
     | 
    
         
            +
                    )
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                    @current_count = @students.count
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                    @students_list = @students.get_students(0, 10, nil)
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                    @students.remove_student(@students_list[0].id)
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                    assert_equal(1, @current_count - @students.count)
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,64 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: model_gem
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.1.6
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Null_Delta
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire:
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: exe
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2023-04-28 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies: []
         
     | 
| 
      
 13 
     | 
    
         
            +
            description: Гем с модельками и контроллерами
         
     | 
| 
      
 14 
     | 
    
         
            +
            email:
         
     | 
| 
      
 15 
     | 
    
         
            +
            - delta.null@vk.com
         
     | 
| 
      
 16 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 17 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 18 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 19 
     | 
    
         
            +
            files:
         
     | 
| 
      
 20 
     | 
    
         
            +
            - "./model_gem_source/attr_limited_regex_accessor.rb"
         
     | 
| 
      
 21 
     | 
    
         
            +
            - "./model_gem_source/controllers/create_student_controller.rb"
         
     | 
| 
      
 22 
     | 
    
         
            +
            - "./model_gem_source/controllers/edit_student_controller.rb"
         
     | 
| 
      
 23 
     | 
    
         
            +
            - "./model_gem_source/controllers/view_controller.rb"
         
     | 
| 
      
 24 
     | 
    
         
            +
            - "./model_gem_source/data_construct_pattern/data_construct_pattarn.rb"
         
     | 
| 
      
 25 
     | 
    
         
            +
            - "./model_gem_source/data_list.rb"
         
     | 
| 
      
 26 
     | 
    
         
            +
            - "./model_gem_source/data_list_student_short.rb"
         
     | 
| 
      
 27 
     | 
    
         
            +
            - "./model_gem_source/data_table.rb"
         
     | 
| 
      
 28 
     | 
    
         
            +
            - "./model_gem_source/database/scripts/create_table.sql"
         
     | 
| 
      
 29 
     | 
    
         
            +
            - "./model_gem_source/database/scripts/fill_data.sql"
         
     | 
| 
      
 30 
     | 
    
         
            +
            - "./model_gem_source/database/students_db.rb"
         
     | 
| 
      
 31 
     | 
    
         
            +
            - "./model_gem_source/database/students_list_db.rb"
         
     | 
| 
      
 32 
     | 
    
         
            +
            - "./model_gem_source/student/abstract_student.rb"
         
     | 
| 
      
 33 
     | 
    
         
            +
            - "./model_gem_source/student/student.rb"
         
     | 
| 
      
 34 
     | 
    
         
            +
            - "./model_gem_source/student/student_short.rb"
         
     | 
| 
      
 35 
     | 
    
         
            +
            - "./model_gem_source/student_list_format.rb"
         
     | 
| 
      
 36 
     | 
    
         
            +
            - "./model_gem_source/students_list.rb"
         
     | 
| 
      
 37 
     | 
    
         
            +
            - "./model_gem_source/students_list_adapter.rb"
         
     | 
| 
      
 38 
     | 
    
         
            +
            - "./model_gem_source/students_list_format_strategy.rb"
         
     | 
| 
      
 39 
     | 
    
         
            +
            - "./model_gem_source/students_tests.rb"
         
     | 
| 
      
 40 
     | 
    
         
            +
            homepage: https://rubygems.org/gems/model_gem
         
     | 
| 
      
 41 
     | 
    
         
            +
            licenses:
         
     | 
| 
      
 42 
     | 
    
         
            +
            - MIT
         
     | 
| 
      
 43 
     | 
    
         
            +
            metadata:
         
     | 
| 
      
 44 
     | 
    
         
            +
              homepage_uri: https://rubygems.org/gems/model_gem
         
     | 
| 
      
 45 
     | 
    
         
            +
            post_install_message:
         
     | 
| 
      
 46 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 47 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 48 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 49 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 50 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 51 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 52 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 53 
     | 
    
         
            +
                  version: 2.6.0
         
     | 
| 
      
 54 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 55 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 56 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 57 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 58 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 59 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 60 
     | 
    
         
            +
            rubygems_version: 3.4.10
         
     | 
| 
      
 61 
     | 
    
         
            +
            signing_key:
         
     | 
| 
      
 62 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 63 
     | 
    
         
            +
            summary: Гем с модельками и контроллерами
         
     | 
| 
      
 64 
     | 
    
         
            +
            test_files: []
         
     |