rafmycat 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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