rafmycat 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,73 @@
1
+ class StudentListBase
2
+
3
+ attr_writer :data_type
4
+
5
+ # конструктор
6
+ def initialize(data_type)
7
+ self.students = []
8
+ self.this_id = 1
9
+ self.data_type = data_type
10
+ end
11
+
12
+ def load_from_file(file_address)
13
+ list = data_type.string_to_list(File.read(file_address))
14
+ self.students = list.map{ |i|
15
+ Student.new(**i)
16
+ }
17
+ new_this_id
18
+ end
19
+
20
+ def save_to_file(file_address)
21
+ list = students.map(&:to_hash)
22
+ File.write(file_address, data_type.list_to_string(list))
23
+ end
24
+
25
+ def student_by_id(student_id)
26
+ students.detect { |student_i| student_i.id == student_id}
27
+ end
28
+
29
+
30
+ def sort_students
31
+ students.sort_by(&:short_name)
32
+ end
33
+
34
+ def add_student(student)
35
+ student.id = this_id
36
+ students << student
37
+ self.this_id += 1
38
+ end
39
+
40
+ def replace_student(id, student)
41
+ this_student = students.find_index {
42
+ |stud|
43
+ stud.id == id
44
+ }
45
+ students[this_student] = student
46
+ end
47
+
48
+ def delete_student(id)
49
+ students.reject!{|stud| stud.id == id}
50
+ end
51
+
52
+ def get_k_n_student_short_list(page, n, data_list)
53
+ page_list = students[(page-1)*n, n].map{|st| StudentShort.new(st)}
54
+ return DataListStudentShort.new(page_list) if data_list.nil?
55
+ data_list.replace_objects(page_list)
56
+ data_list
57
+ end
58
+
59
+ def student_count
60
+ students.size
61
+ end
62
+
63
+ protected
64
+
65
+ attr_accessor :students, :this_id
66
+
67
+ private
68
+
69
+ def new_this_id
70
+ self.this_id = students.max_by(&:id).id.to_i + 1
71
+ end
72
+ attr_reader :data_type
73
+ end
@@ -0,0 +1,10 @@
1
+ class StudentListStrategy
2
+ private_class_method :new
3
+
4
+ protected
5
+
6
+ def string_to_list(str); end
7
+
8
+ def list_to_string(list); end
9
+
10
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'student_list_strategy'
2
+ require 'json'
3
+ require 'yaml'
4
+
5
+ class StudentListJson < StudentListStrategy
6
+
7
+ public_class_method :new
8
+
9
+ def string_to_list(str)
10
+ JSON.parse(str, {symbolize_names: true})
11
+ end
12
+
13
+ def list_to_string(list)
14
+ JSON.generate(list)
15
+ end
16
+ end
@@ -0,0 +1,44 @@
1
+ require_relative 'student_list_strategy'
2
+ require 'json'
3
+
4
+ class StudentListTxt < StudentListStrategy
5
+ public_class_method :new
6
+
7
+ #Переопределяем методы
8
+ def string_to_list(str)
9
+ to_hash(str.split("\n").map(&:chomp))
10
+ end
11
+
12
+ def list_to_string(list)
13
+ to_string(list)
14
+ end
15
+
16
+ #делаем приватными методы реализующие перевод из list в string и наоборот
17
+ private
18
+
19
+ def to_hash( list_strings)
20
+ list_hashes = []
21
+ list_strings.each do
22
+ |str|
23
+ str = str.gsub('"', "")
24
+ h = {}
25
+ str.split(',').each do |atr|
26
+ key, value = atr.split(':').map(&:strip)
27
+ h[key.to_sym] = value
28
+ end
29
+ list_hashes << h
30
+ end
31
+ list_hashes
32
+ end
33
+
34
+ def to_string (hashes)
35
+ str = hashes.map do
36
+ |h|
37
+ h.map{
38
+ |key, value|
39
+ "#{key}: #{value.inspect}"
40
+ }.join(",")
41
+ end
42
+ str.join("\n")
43
+ end
44
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'student_list_strategy'
3
+ require 'yaml'
4
+ require 'json'
5
+
6
+ class StudentListYaml<StudentListStrategy
7
+ public_class_method :new
8
+
9
+
10
+ #переопределили методы
11
+ def string_to_list(str)
12
+ YAML.safe_load(str).map {|h| h.transform_keys(&:to_sym)}
13
+ end
14
+
15
+ def list_to_string(list)
16
+ list.map {
17
+ |h|
18
+ h.transform_keys(&:to_s)}.to_yaml
19
+ end
20
+ end
@@ -0,0 +1,151 @@
1
+ require 'json'
2
+ require_relative 'student_short'
3
+ class Student < StudentShort
4
+
5
+ # создаем методы чтения и записи attr_accessor
6
+ attr_accessor :id
7
+ attr_reader :last_name, :first_name, :paternal_name, :phone, :git, :telegram, :email
8
+
9
+ #валидатор телефона #+++++++++
10
+ def self.valid_phone?(phone)
11
+ phone.match(/^\+?[7,8] ?\(?\d{3}\)?-?\d{3}-?\d{2}-?\d{2}$/)
12
+ end
13
+
14
+ #валидатор для фамилии имени и отчества ++++
15
+ def self.valid_name?(name)
16
+ name.match(/^[А-Я][а-я]+$/)
17
+ end
18
+
19
+ #валидатор для git и telegram #++++++
20
+ def self.valid_account?(account)
21
+ account.match(/^@[A-Za-z0-9\-_]+$/)
22
+ end
23
+
24
+ #валидатор почты ++
25
+ def self.valid_email?(email)
26
+ email.match(/^[A-Za-z0-9\-_]+@[A-Za-z]+\.([A-Za-z]+\.)*[A-Za-z]+$/)
27
+ end
28
+
29
+ # конструктор
30
+ def initialize(last_name:nil, first_name:nil, paternal_name:nil, id:nil, phone:nil, git:nil, telegram:nil, email:nil)
31
+ raise ArgumentError, "Required fields: last_name, first_name and paternal_name!" if last_name.nil?|| first_name.nil? || paternal_name.nil?
32
+ self.last_name = last_name
33
+ self.first_name = first_name
34
+ self.paternal_name = paternal_name
35
+ self.id = id
36
+ self.git = git
37
+ self.set_contacts(phone:phone, telegram:telegram, email:email)
38
+ end
39
+ def self.into_hash(hash)
40
+ Student.new(**hash)
41
+ end
42
+
43
+ #++
44
+ def self.pars_str(str)
45
+ args = JSON.parse(str)
46
+ raise ArgumentError,"The argument must have last_name, first_name and paternal_name" unless
47
+ (args.has_key?('last_name') and args.has_key?('first_name') and args.has_key?('paternal_name'))
48
+
49
+ new(last_name: args['last_name'],
50
+ first_name: args['first_name'],
51
+ paternal_name: args['paternal_name'],
52
+ id: args['id'],
53
+ phone: args['phone'],
54
+ git: args['git'],
55
+ telegram: args['telegram'],
56
+ email: args['email'])
57
+ end
58
+
59
+ #(last_name, first_name, paternal_name, id:nil, phone:nil, git:nil, telegram:nil, email:nil)
60
+ # ++
61
+ def shortName
62
+ "#{last_name} #{first_name[0]}. #{paternal_name[0]}."
63
+ end
64
+
65
+ def contact
66
+ if phone
67
+ @contact = {type: :phone, value: phone}
68
+ elsif telegram
69
+ @contact = {type: :telegram, value: telegram}
70
+ elsif email
71
+ @contact = {type: :email, value: email}
72
+ end
73
+ end
74
+
75
+ def getInfo
76
+ raise ArgumentError, "Required fields: last_name, first_name and paternal_name!" if last_name.nil?|| first_name.nil? || paternal_name.nil?
77
+ info = "#{shortName}"
78
+ info += " #{getContact}" unless getContact.nil?
79
+ info += " git= #{git}" unless git.nil?
80
+ info
81
+ end
82
+
83
+ def to_hash
84
+ attrs = {}
85
+
86
+ %i[first_name last_name paternal_name id phone telegram email git].each do |attr|
87
+ attr_val = send(attr)
88
+ attrs[attr] = attr_val unless attr_val.nil?
89
+ end
90
+ attrs
91
+ end
92
+
93
+ #сеттер
94
+ def phone=(phone)
95
+ raise ArgumentError, "Incorrect value: phone=#{phone}!" if !phone.nil? && !Student.valid_phone?(phone)
96
+ @phone = phone
97
+ end
98
+
99
+ def first_name=(first_name)
100
+ raise ArgumentError, "Incorrect value: first_name=#{first_name}!" if !first_name.nil? && !Student.valid_name?(first_name)
101
+ @first_name = first_name
102
+ end
103
+
104
+ def last_name=(last_name)
105
+ raise ArgumentError, "Incorrect value: last_name=#{last_name}!" if !last_name.nil? && !Student.valid_name?(last_name)
106
+ @last_name = last_name
107
+ end
108
+
109
+ def paternal_name=(paternal_name)
110
+ raise ArgumentError, "Incorrect value: paternal_name=#{paternal_name}!" if !paternal_name.nil? && !Student.valid_name?(paternal_name)
111
+ @paternal_name = paternal_name
112
+ end
113
+
114
+ def git=(git)
115
+ raise ArgumentError, "Incorrect value: git=#{git}!" if !git.nil? && !Student.valid_account?(git)
116
+ @git = git
117
+ end
118
+
119
+ def telegram=(telegram)
120
+ raise ArgumentError, "Incorrect value: telegram=#{telegram}!" if !telegram.nil? && !Student.valid_account?(telegram)
121
+ @telegram = telegram
122
+ end
123
+
124
+ def email=(email)
125
+ raise ArgumentError, "Incorrect value: email=#{email}!" if !email.nil? && !Student.valid_email?(email)
126
+ @email = email
127
+ end
128
+
129
+ def validate?
130
+ !git.nil? && !email.nil? && !telegram.nil? && !phone.nil?
131
+ end
132
+
133
+ def set_contacts(phone: nil, telegram: nil, email: nil)
134
+ self.phone = phone if phone
135
+ self.email = email if email
136
+ self.telegram = telegram if telegram
137
+ @contact = contact
138
+ end
139
+
140
+
141
+ def to_s
142
+ res = self.last_name + " " + self.first_name + " " + self.paternal_name
143
+ res+=" id: #{self.id}" unless self.id.nil?
144
+ res+=" phone: #{self.phone}" unless self.phone.nil?
145
+ res+=" git: #{self.git}" unless self.git.nil?
146
+ res+=" telegram: #{self.telegram}" unless self.telegram.nil?
147
+ res+=" email: #{self.email}" unless self.email.nil?
148
+ res
149
+ end
150
+ end
151
+
@@ -0,0 +1,35 @@
1
+ require 'json'
2
+ #(last_name, first_name, paternal_name, id:nil, phone:nil, git:nil, telegram:nil, email:nil)
3
+ class StudentShort
4
+
5
+ attr_reader :id, :git, :contact, :initials
6
+
7
+ def initialize(student)
8
+ @id = student.id
9
+ @initials = "#{student.last_name} #{student.first_name[0]}.#{student.paternal_name[0]}. "
10
+ @git = student.git unless student.git.nil?
11
+ @contact = student.set_contacts(phone: student.phone, email: student.email, telegram: student.telegram)
12
+ end
13
+
14
+ def self.from_str(id, str)
15
+ result = JSON.parse(str)
16
+ raise ArgumentError, 'Missing fields: last_name, first_name, paternal_name' unless result.key?('first_name') &&
17
+ result.key?('last_name') && result.key?('paternal_name')
18
+
19
+ StudentShort.new(Student.new(last_name: result['last_name'],first_name: result['first_name'],
20
+ paternal_name: result['paternal_name'],id: id,
21
+ phone: result['phone'], git: result['git'],
22
+ email: result['email'],telegram: result['telegram']))
23
+ end
24
+
25
+ def shortName
26
+ "#{@initials}"
27
+ end
28
+ def to_s
29
+ res = "#{initials}"
30
+ res += "id=#{id}" unless id.nil?
31
+ res += " git=#{git}" unless git.nil?
32
+ res += " #{contact}" unless contact.nil?
33
+ res
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../strategy/student_list_base'
2
+ class StudentFileAdapter
3
+ def initialize(type_file,file_address)
4
+ #обращаемся к экземплярам класса StudentListBase
5
+ @file = StudentListBase.new(type_file)
6
+ @file.load_from_file(file_address)
7
+ @file_address = file_address
8
+ end
9
+
10
+ def student_by_id(id_student)
11
+ @file.student_by_id(id_student)
12
+ end
13
+
14
+ def add_student(student)
15
+ @file.add_student(student)
16
+ @file.save_to_file(@file_address)
17
+ end
18
+
19
+ def delete_student(id_student)
20
+ @file.delete_student(id_student)
21
+ @file.save_to_file(@file_address)
22
+ end
23
+
24
+ def replace_student(id_student, student)
25
+ @file.replace_student(id_student, student)
26
+ @file.save_to_file(@file_address)
27
+ end
28
+
29
+ def count_student
30
+ @file.count_student
31
+ end
32
+
33
+ def get_k_n_student_short_list(page,n, data_list)
34
+ @file.get_k_n_student_short_list(page, n, data_list)
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ class StudentList
2
+ def initialize(adapter)
3
+ @adapter = adapter
4
+ end
5
+
6
+ def student_by_id(id_student)
7
+ @adapter.student_by_id(id_student)
8
+ end
9
+
10
+ def add_student(student)
11
+ @adapter.add_student(student)
12
+ end
13
+
14
+ def delete_student(id_student)
15
+ @adapter.delete_student(id_student)
16
+ end
17
+
18
+ def replace_student(id_student, student)
19
+ @adapter.replace_student(id_student, student)
20
+ end
21
+
22
+ def count_student
23
+ @adapter.count_student
24
+ end
25
+
26
+ def get_k_n_student_short_list(k,n, data_list)
27
+ @adapter.get_k_n_student_short_list(k,n, data_list)
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ class StudentContactFormController
2
+ def initialize(parent_controller, existing_student_id)
3
+ @parent_controller = parent_controller
4
+ @existing_student_id = existing_student_id
5
+ LoggerHolder.instance.debug('StudentCreateFormController: initialized')
6
+ end
7
+
8
+ def view=(view)
9
+ @view = view
10
+ LoggerHolder.instance.debug('StudentCreateFormController: setter view')
11
+ end
12
+
13
+ def on_view_created
14
+ @student_list = StudentList.new(StudentListDBAdapter.new)
15
+ @existing_student = @student_list.student_by_id(@existing_student_id)
16
+ @view.make_readonly(:first_name,:last_name,:paternal_name, :git)
17
+ set_fields(@existing_student)
18
+ end
19
+
20
+ def set_fields(student)
21
+ student = student
22
+ puts student
23
+ @view.set_value(:last_name, student.last_name)
24
+ @view.set_value(:first_name, student.first_name)
25
+ @view.set_value(:paternal_name, student.paternal_name)
26
+ @view.set_value(:git, student.git)
27
+ @view.set_value(:telegram, student.telegram)
28
+ @view.set_value(:email, student.email)
29
+ @view.set_value(:phone, student.phone)
30
+ end
31
+
32
+
33
+ def process_fields(fields)
34
+ new_student = Student.new(**fields)
35
+ @student_list.replace_student(@existing_student_id, new_student)
36
+ @view.close
37
+ LoggerHolder.instance.debug('StudentCreateFormController: add student')
38
+ end
39
+
40
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'glimmer-dsl-libui'
4
+ require_relative 'student_create_form_controller'
5
+ require_relative '../student/student'
6
+
7
+
8
+ class StudentCreateForm
9
+ include Glimmer
10
+ #puts "hello"
11
+
12
+ def initialize(controller,existing_student = nil)
13
+ @existing_student = existing_student.to_hash unless existing_student.nil?
14
+ @controller = controller
15
+ @entries = {}
16
+ end
17
+
18
+ def on_create
19
+ @controller.on_view_created
20
+ end
21
+
22
+ def create
23
+ @root_container = window('Универ', 300, 200) {
24
+
25
+ vertical_box {
26
+ @student_form = form {
27
+ stretchy false
28
+
29
+ fields = [[:last_name, 'Фамилия', false], [:first_name, 'Имя', false], [:paternal_name, 'Отчество', false], [:git, 'Гит', true], [:telegram, 'Телеграм', true], [:email, 'Почта', true], [:phone, 'Телефон', true]]
30
+
31
+ fields.each do |field|
32
+ @entries[field[0]] = entry {
33
+ label field[1]
34
+ }
35
+ end
36
+ }
37
+
38
+ button('Сохранить') {
39
+ stretchy false
40
+
41
+ on_clicked {
42
+ values = @entries.transform_values { |v| v.text.force_encoding("utf-8").strip }
43
+ values.transform_values! { |v| v.empty? ? nil : v}
44
+ @controller.process_fields(values)
45
+ }
46
+ }
47
+ }
48
+ }
49
+ on_create
50
+ @root_container
51
+ end
52
+
53
+ def set_value(field, value)
54
+ return unless @entries.include?(field)
55
+
56
+ @entries[field].text = value
57
+ end
58
+
59
+ def make_readonly(*fields)
60
+ fields.each do |field|
61
+ @entries[field].read_only = true
62
+ end
63
+ end
64
+ def close
65
+ @root_container.destroy
66
+ end
67
+ end
@@ -0,0 +1,35 @@
1
+ require 'sqlite3'
2
+ require_relative 'studentList'
3
+ require_relative 'studentFileAdapter'
4
+ require_relative 'logger_holder'
5
+ class StudentCreateFormController
6
+ def initialize(controller)
7
+ @controller = controller
8
+ end
9
+
10
+ def on_view_created
11
+ begin
12
+ #raise StandardError "Test"
13
+ @student_rep = StudentList.new(StudentListDBAdapter.new)
14
+ rescue SQLException::SQLException => e
15
+ on_db_conn_error(e)
16
+ end
17
+ end
18
+
19
+ def view=(view)
20
+ @view = view
21
+ end
22
+
23
+ def process_fields(fields)
24
+ student = Student.new(**fields)
25
+ @student_rep.add_student(student)
26
+ @view.close
27
+ @controller.view.refresh_current_page
28
+ end
29
+
30
+ def on_db_conn_error(e)
31
+ api = Win32API.new('user32', 'MessageBox', ['L', 'P', 'P', 'L'], 'I')
32
+ api.call(0, "No connection to DB", "Error", 0)
33
+ exit(false)
34
+ end
35
+ end
@@ -0,0 +1,40 @@
1
+ require_relative 'logger_holder'
2
+ class StudentEditFormController
3
+ def initialize(parent_controller, existing_student_id)
4
+ @parent_controller = parent_controller
5
+ @existing_student_id = existing_student_id
6
+ LoggerHolder.instance.debug('StudentEditFormController: initialized')
7
+ end
8
+
9
+ def view=(view)
10
+ @view = view
11
+ LoggerHolder.instance.debug('StudentEditFormController: view')
12
+ end
13
+
14
+ def on_view_created
15
+ @student_list = StudentList.new(StudentListDBAdapter.new)
16
+ @existing_student = @student_list.student_by_id(@existing_student_id)
17
+ @view.make_readonly(:git, :telegram, :email, :phone)
18
+ set_fields(@existing_student)
19
+ end
20
+
21
+ def set_fields(student)
22
+ student = student
23
+ puts student
24
+ @view.set_value(:last_name, student.last_name)
25
+ @view.set_value(:first_name, student.first_name)
26
+ @view.set_value(:paternal_name, student.paternal_name)
27
+ @view.set_value(:git, student.git)
28
+ @view.set_value(:telegram, student.telegram)
29
+ @view.set_value(:email, student.email)
30
+ @view.set_value(:phone, student.phone)
31
+ end
32
+
33
+ def process_fields(fields)
34
+ new_student = Student.new(**fields)
35
+ LoggerHolder.instance.debug('StudentEditFormController: replace student')
36
+ @student_list.replace_student(@existing_student_id, new_student)
37
+ @view.close
38
+ @parent_controller.view.refresh_current_page
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ class StudentGitFormController
2
+ def initialize(parent_controller, existing_student_id)
3
+ @parent_controller = parent_controller
4
+ @existing_student_id = existing_student_id
5
+ end
6
+
7
+ def view=(view)
8
+ @view = view
9
+ end
10
+
11
+ def on_view_created
12
+ @student_list = StudentList.new(StudentListDBAdapter.new)
13
+ @existing_student = @student_list.student_by_id(@existing_student_id)
14
+ @view.make_readonly(:first_name,:last_name,:paternal_name, :telegram, :email, :phone)
15
+ set_fields(@existing_student)
16
+ end
17
+
18
+ def set_fields(student)
19
+ student = student
20
+ puts student
21
+ @view.set_value(:last_name, student.last_name)
22
+ @view.set_value(:first_name, student.first_name)
23
+ @view.set_value(:paternal_name, student.paternal_name)
24
+ @view.set_value(:git, student.git)
25
+ @view.set_value(:telegram, student.telegram)
26
+ @view.set_value(:email, student.email)
27
+ @view.set_value(:phone, student.phone)
28
+ end
29
+
30
+
31
+ def process_fields(fields)
32
+ new_student = Student.new(**fields)
33
+ @student_list.replace_student(@existing_student_id, new_student)
34
+ @view.close
35
+ end
36
+
37
+
38
+ end
data/rafmycat.gemspec ADDED
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/raf/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rafmycat"
7
+ spec.version = Raf::VERSION
8
+ spec.authors = ["Valentina Goncharenko"]
9
+ spec.email = ["valentinagoncarenko975@gmail.com"]
10
+ spec.summary = "Student App"
11
+ spec.description = "А gem that allows you to get pass for patterns"
12
+ spec.homepage = "https://github.com/yellowcat-dotcom"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = ">= 3.2.0"
15
+ spec.add_dependency 'sqlite3'
16
+ spec.files = Dir.glob("**/*")
17
+ end
@@ -0,0 +1,4 @@
1
+ module RubbishCode
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end