onlyoffice_gmail_helper 0.2.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,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a72371e5187dc5f9ea6b6cd938c77d0f3288f9c44b6399dd71fd392aa6eb1441
4
+ data.tar.gz: 13668d6d4485109a04a6449275f81acb6eb57fcaa2b1c581bbc5baf1f426fcde
5
+ SHA512:
6
+ metadata.gz: a4da08cf22fda03b870d5d18d4bdca3a86c763b00415eec83adae9e75e9f633f6c6abe2dda795bd26561f49041bd3b6b07bbc61e8f089a6e84502d7b48fb44d2
7
+ data.tar.gz: baf3cf12a74db4fbdbfcc55c814b469c78c631264187398aba19fad5eba5728fe38373b8c86c30eab29217a6159e3fbf3686c32b6f2178f89aea83baf9bb9dd6
@@ -0,0 +1,502 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'gmail'
4
+ require 'onlyoffice_logger_helper'
5
+ require 'onlyoffice_gmail_helper/email_account'
6
+ require 'onlyoffice_gmail_helper/mail_message'
7
+ require 'onlyoffice_gmail_helper/version'
8
+
9
+ # Override object class
10
+ class Object
11
+ # @return [Date] format date for imap
12
+ def to_imap_date
13
+ Date.parse(to_s).strftime('%d-%b-%Y')
14
+ end
15
+ end
16
+
17
+ # Monkey patch IMAP to fix https://bugs.ruby-lang.org/issues/14750
18
+ # TODO: Remove after release of fix as stable version
19
+ module Net
20
+ # Imap main class
21
+ class IMAP
22
+ # override bugged method
23
+ alias send_literal_bug_14750 send_literal
24
+
25
+ # Override for but 14750
26
+ def send_literal(str, tag = nil)
27
+ if RUBY_VERSION.start_with?('2.5', '2.6')
28
+ send_literal_bug_14750(str, tag)
29
+ else
30
+ send_literal_bug_14750(str)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ # Helper module for GMail
37
+ module OnlyofficeGmailHelper
38
+ # Main class of gem
39
+ class Gmail_helper
40
+ # @return [Gmail] gmail object
41
+ attr_accessor :gmail
42
+ # @return [String] user name
43
+ attr_accessor :user
44
+ # @return [String] user password
45
+ attr_accessor :password
46
+ # @return [Integer] default timeout for operation
47
+ attr_accessor :timeout_for_mail
48
+ # @return [String] default label
49
+ attr_accessor :label
50
+
51
+ def initialize(user = EmailAccount::GMAIL_DEFAULT.login, password = EmailAccount::GMAIL_DEFAULT.password, timeout_for_mail = 10, label = nil)
52
+ @user = user
53
+ @password = password
54
+ @gmail = Gmail.new(user, password)
55
+ @imap = @gmail.instance_variable_get(:@imap)
56
+ @timeout_for_mail = timeout_for_mail
57
+ @label = label
58
+ end
59
+
60
+ # Select mailbox
61
+ # @return [nil]
62
+ def mailbox
63
+ if @label
64
+ if @label == :inbox
65
+ @gmail.inbox
66
+ else
67
+ @gmail.mailbox(@label)
68
+ end
69
+ else
70
+ @gmail.mailbox('[Gmail]/All Mail')
71
+ end
72
+ end
73
+
74
+ # Perform logout
75
+ # @return [nil]
76
+ def logout
77
+ @gmail.logout
78
+ @imap.disconnect until @imap.disconnected?
79
+ rescue StandardError
80
+ Exception
81
+ end
82
+
83
+ # Refresh connection data
84
+ # @return [nil]
85
+ def refresh
86
+ logout
87
+ @gmail = Gmail.new(@user, @password)
88
+ end
89
+
90
+ # Wait until unread message exists
91
+ # @param [String] title message to wait
92
+ # @param [Integer] timeout to wait
93
+ # @param [Integer] period sleep between tries
94
+ # @return [MailMessage] found message
95
+ def wait_until_unread_message(title,
96
+ timeout = @timeout_for_mail, period = 60)
97
+ counter = 0
98
+ message_found = false
99
+ while counter < timeout && !message_found
100
+ @gmail.inbox.emails.each do |current_mail|
101
+ next unless current_mail.subject.include?(title)
102
+
103
+ message = MailMessage.new(current_mail.subject,
104
+ current_mail.html_part.body)
105
+ return message
106
+ end
107
+ sleep period
108
+ refresh
109
+ end
110
+ raise "Message with title: #{title} not found for #{timeout * 60} seconds"
111
+ end
112
+
113
+ # Get body message by title
114
+ # @param [String] current_portal_full portal name to search
115
+ # @param [String] title1 title to filter
116
+ # @param [String] title2 title to filter
117
+ # @param [Boolean] delete this message
118
+ # @param [Boolean] _to_mail unused
119
+ # @return [MailMessage] found message
120
+ def get_body_message_by_title_from_mail(current_portal_full, title1 = 'Welcome to ONLYOFFICE™ Portal!', title2 = 'Добро пожаловать на портал TeamLab!', delete = true, _to_mail = nil)
121
+ mail_not_found = true
122
+ attempt = 0
123
+ while mail_not_found
124
+ messages_array = mailbox.emails(:unread, search: current_portal_full.to_s)
125
+ messages_array.each do |current_mail|
126
+ current_subject = current_mail.message.subject
127
+ a = current_subject.include? title1
128
+ b = current_subject.include? title2
129
+ if a || b
130
+ current_subject = begin
131
+ current_mail.html_part.body.decoded.force_encoding('utf-8').encode('UTF-8')
132
+ rescue StandardError
133
+ Exception
134
+ end
135
+ current_mail.delete! if current_subject == 'Welcome to Your TeamLab Portal!'
136
+ if current_subject.include? current_portal_full
137
+ current_mail.delete! if delete
138
+ return current_subject
139
+ end
140
+ else
141
+ raise "Message with title: #{title1} not found after #{attempt} attempt" if attempt == 10
142
+
143
+ sleep 10
144
+ attempt += 1
145
+ current_mail.delete! if delete
146
+ end
147
+ end
148
+ end
149
+ end
150
+
151
+ # Get mail body by title
152
+ # @param [String] portal_address to filter
153
+ # @param [String] subject to find
154
+ # @param [Integer] time to wait
155
+ # @param [Boolean] delete if needed
156
+ # @return [MailMessage] found message
157
+ def get_body_message_by_title(portal_address, subject, time = 300, delete = true)
158
+ start_time = Time.now
159
+ flags = block_given? ? yield : { search: portal_address.to_s }
160
+ while Time.now - start_time < time
161
+ messages_array = mailbox.emails(:unread, flags)
162
+ messages_array.each do |current_mail|
163
+ next unless message_found?(current_mail.message.subject, subject)
164
+
165
+ body = begin
166
+ current_mail.html_part.body.decoded.force_encoding('utf-8').encode('UTF-8')
167
+ rescue StandardError
168
+ Exception
169
+ end
170
+ current_mail.delete! if delete
171
+ return body
172
+ end
173
+ end
174
+ nil
175
+ end
176
+
177
+ # @return [Array<Message>] list of underad messages
178
+ def get_unread_messages
179
+ refresh
180
+ array_of_mail = []
181
+ mailbox.emails(:unread).reverse_each do |current_mail|
182
+ current_title = current_mail.message.subject
183
+ current_subject = begin
184
+ current_mail.html_part.body.decoded
185
+ .force_encoding('utf-8').encode('UTF-8')
186
+ rescue StandardError
187
+ Exception
188
+ end
189
+ current_mail.mark(:unread)
190
+ reply_to = current_mail.reply_to[0] unless current_mail.reply_to == []
191
+ array_of_mail << MailMessage.new(current_title,
192
+ current_subject,
193
+ reply_to)
194
+ end
195
+ array_of_mail
196
+ end
197
+
198
+ # received mail in format "Thu, 23 Jan 2014 15:34:57 +0400". Day of week may\may not be present
199
+ # @param [String] date_str original string
200
+ # @return [Hash] date
201
+ def get_current_date(date_str)
202
+ data_arr = date_str.split.reverse
203
+ { day: data_arr[4].to_i, hour: data_arr[1].split(':')[0].to_i, minute: data_arr[1].split(':')[1].to_i }
204
+ end
205
+
206
+ # Check unread messages for message
207
+ # @param [String] mail_message to find
208
+ # @return [Boolean] result
209
+ def check_unread_messages_for_message(mail_message)
210
+ messages = get_unread_messages
211
+ timer = 0
212
+ message_found = false
213
+ while timer < @timeout_for_mail && message_found == false
214
+ messages.each do |current_unread_mail|
215
+ # p current_unread_mail
216
+ if current_unread_mail == mail_message
217
+ delete_messages(current_unread_mail)
218
+ return true
219
+ end
220
+ end
221
+ messages = get_unread_messages
222
+ timer += 1
223
+ end
224
+ false
225
+ end
226
+
227
+ # Check message for message with portal
228
+ # @param [String] message title
229
+ # @param [String] current_portal_full_name name
230
+ # @param [Integer] times to wait
231
+ # @return [Boolean] is messag found
232
+ def check_messages_for_message_with_portal_address(message, current_portal_full_name, times: 300)
233
+ times.times do
234
+ messages_array = mailbox.emails(:unread, search: current_portal_full_name.to_s)
235
+ messages_array.each do |current_mail|
236
+ next unless message_found?(current_mail.message.subject, message.title)
237
+
238
+ OnlyofficeLoggerHelper.log('Email successfully found and removed')
239
+ current_mail.delete!
240
+ return true
241
+ end
242
+ sleep 1
243
+ end
244
+ false
245
+ end
246
+
247
+ # Delete message with portal address
248
+ # @param [String] message title to delete
249
+ # @param [String] current_portal_full_name to delete
250
+ # @return [nil]
251
+ def delete_message_with_portal_address(message, current_portal_full_name)
252
+ 300.times do
253
+ messages_array = mailbox.emails(:unread, search: current_portal_full_name.to_s)
254
+ messages_array.each do |current_mail|
255
+ if message.title == current_mail.message.subject
256
+ current_mail.delete!
257
+ return true
258
+ else
259
+ begin
260
+ current_mail.mark(:unread)
261
+ rescue StandardError
262
+ Exception
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end
268
+
269
+ # Delete specific message
270
+ # @param [String] message title to delete
271
+ # @return [nil]
272
+ def delete_messages(message)
273
+ message = [message] unless message.is_a?(Array)
274
+ message.each do |message_to_delete|
275
+ mailbox.emails(:unread).each do |current_mail|
276
+ if message_to_delete.title == current_mail.message.subject
277
+ current_mail.delete!
278
+ else
279
+ begin
280
+ current_mail.mark(:unread)
281
+ rescue StandardError
282
+ Exception
283
+ end
284
+ end
285
+ end
286
+ end
287
+ end
288
+
289
+ # Delete all messsages
290
+ # @return [nil]
291
+ def delete_all_messages
292
+ OnlyofficeLoggerHelper.log("Start deleting all messaged on mail: #{@user}")
293
+ mailbox.emails.each(&:delete!)
294
+ @gmail.logout
295
+ OnlyofficeLoggerHelper.log("Finished deleting all messaged on mail: #{@user}")
296
+ end
297
+
298
+ # Archive all inbox
299
+ # @return [nil]
300
+ def archive_inbox
301
+ OnlyofficeLoggerHelper.log("Start achieving all messaged in inbox on mail: #{@user}")
302
+ @gmail.inbox.emails.each(&:archive!) if mail_inbox_count.nonzero?
303
+ OnlyofficeLoggerHelper.log("Finished achieving all messaged in inbox on mail: #{@user}")
304
+ end
305
+
306
+ # @param [String] contain_string message to delete
307
+ # @return [nil]
308
+ def delete_all_message_contains(contain_string)
309
+ OnlyofficeLoggerHelper.log("Messages containing #{contain_string} will be deleted")
310
+ messages_array = mailbox.emails(:unread, search: contain_string)
311
+ messages_array.each(&:delete!)
312
+ end
313
+
314
+ # Reply to mail
315
+ # @param [String] mail_to_reply
316
+ # @param [String] reply_body to do
317
+ # @return [nil]
318
+ def reply_mail(mail_to_reply, reply_body)
319
+ messages = get_unread_messages
320
+ timer = 0
321
+ message_found = false
322
+ while timer < @timeout_for_mail && message_found == false
323
+ messages.each do |current_unread_mail|
324
+ next unless current_unread_mail == mail_to_reply
325
+
326
+ email = @gmail.compose do
327
+ to("#{current_unread_mail.reply_to.mailbox}@#{current_unread_mail.reply_to.host}".to_s)
328
+ subject "Re: #{current_unread_mail.title}"
329
+ body reply_body
330
+ end
331
+ email.deliver!
332
+ delete_messages(current_unread_mail)
333
+ return true
334
+ end
335
+ messages = get_unread_messages
336
+ timer += 1
337
+ end
338
+ false
339
+ end
340
+
341
+ # Send mail
342
+ # @param [String] email to send
343
+ # @param [String] title to send
344
+ # @param [String] body to send
345
+ # @param [String] attachment to send
346
+ # @return [nil]
347
+ def send_mail(email, title, body, attachment = nil)
348
+ email = @gmail.compose do
349
+ to email
350
+ subject title
351
+ body body
352
+ add_file attachment unless attachment.nil?
353
+ end
354
+ email.deliver!
355
+ OnlyofficeLoggerHelper.log("send_mail(#{email}, #{title}, #{body}, #{attachment})")
356
+ end
357
+
358
+ # Send notification
359
+ # @param [String] email to send
360
+ # @param [String] test_name - name of test
361
+ # @param [String] error - error to send
362
+ # @param [String] mail_title to send
363
+ # @return [nil]
364
+ def send_notification(email, test_name, error, mail_title = 'Teamlab Daily Check')
365
+ body = "Fail in #{test_name}\n" \
366
+ "Error text: \n\t #{error}"
367
+ send_mail(email, mail_title, body)
368
+ end
369
+
370
+ # @return [Integer] count message in inbox
371
+ def mail_inbox_count
372
+ count = @gmail.inbox.emails.count
373
+ OnlyofficeLoggerHelper.log("#{count} mails in inbox of #{@user}")
374
+ count
375
+ end
376
+
377
+ # List all mail in label with date
378
+ # @param [String] string label
379
+ # @param [Date] date_start to find
380
+ # @param [Date] date_end to find
381
+ # @param [String] to whom message send
382
+ # @return [Array<MailMessage>] list of results
383
+ def mail_in_label_with_date(string, date_start, date_end, to = nil)
384
+ array_of_mail = []
385
+ @gmail.mailbox(string).emails(after: date_start, before: date_end, to: to).each do |current_mail|
386
+ current_title = current_mail.message.subject
387
+ current_subject = begin
388
+ current_mail.html_part.body.decoded
389
+ .force_encoding('utf-8').encode('UTF-8')
390
+ rescue StandardError
391
+ Exception
392
+ end
393
+ reply_to = current_mail.reply_to[0] unless current_mail.reply_to.nil?
394
+ array_of_mail << MailMessage.new(current_title,
395
+ current_subject,
396
+ reply_to, Time.parse(current_mail.date))
397
+ end
398
+ array_of_mail
399
+ end
400
+
401
+ # Delete all mail from sender
402
+ # @param [String] string messanger
403
+ # @return [nil]
404
+ def delete_from_sender(string)
405
+ mailbox.emails(from: string).each(&:delete!)
406
+ end
407
+
408
+ # Mark all messages as unread
409
+ # @return [nil]
410
+ def mark_all_unread
411
+ mailbox.emails.each do |current_mail|
412
+ current_mail.mark(:unread)
413
+ end
414
+ end
415
+
416
+ # Send mail test result
417
+ # @param [String] mail to send
418
+ # @param [String] title to send
419
+ # @param [Array<String>] array_results test data
420
+ # @return [nil]
421
+ def send_mail_test_result(mail, title, array_results)
422
+ body = ''
423
+ array_results.each do |current_result|
424
+ current_result[1] = 'OK' if current_result[1].nil?
425
+ body = "#{body}#{current_result[0]}\t#{current_result[1]}\n"
426
+ end
427
+
428
+ if mail.is_a?(Array)
429
+ mail.each do |current_mail_user|
430
+ email = @gmail.compose do
431
+ to current_mail_user
432
+ subject title
433
+ body body
434
+ end
435
+ email.deliver!
436
+ end
437
+ else
438
+ email = @gmail.compose do
439
+ to mail
440
+ subject title
441
+ body body
442
+ end
443
+ email.deliver!
444
+ end
445
+ end
446
+
447
+ # If not returning nested levels please change content of file
448
+ # +/home/#{user}/.rvm/gems/#{gemset}/gems/gmail-0.4.0/lib/gmail/labels.rb+
449
+ # to content of that file: https://github.com/jgrevich/gmail/blob/6ed88950bd631696aeb1bc4b9133b03d1ae4055f/lib/gmail/labels.rb
450
+ # @return [Array<String>] list of all labels
451
+ def get_labels
452
+ @gmail.labels.all
453
+ end
454
+
455
+ # Get list of unread mails with tags
456
+ # @return [Array<MailMessage>] result
457
+ def get_unread_mails_with_tags
458
+ refresh
459
+ array_of_mail = []
460
+ mailbox.emails(:unread).each do |current_mail|
461
+ current_title = current_mail.message.subject
462
+ current_subject = begin
463
+ current_mail.html_part.body.decoded.force_encoding('utf-8').encode('UTF-8')
464
+ rescue StandardError
465
+ Exception
466
+ end
467
+ current_mail.mark(:unread)
468
+ reply_to = current_mail.reply_to[0] unless current_mail.reply_to.nil?
469
+ current_tag = current_mail
470
+ array_of_mail << MailMessage.new(current_title, current_subject, reply_to, current_tag)
471
+ end
472
+ array_of_mail
473
+ end
474
+
475
+ # Get body by email subject
476
+ # @param [String] subject to get
477
+ # @param [String] portal_name to filter
478
+ # @return [String] body
479
+ def get_body_by_subject_email(subject, portal_name)
480
+ p 'get_body_by_subject_email'
481
+ 300.times do |current|
482
+ p "current time: #{current}"
483
+ messages_array = mailbox.emails(:unread, search: portal_name.to_s)
484
+ messages_array.each do |current_mail|
485
+ current_subject = current_mail.message.subject
486
+ p "current_subject: #{current_subject}"
487
+ if message_found?(current_subject, subject)
488
+ body_text = current_mail.message.text_part.body.decoded.force_encoding('utf-8').encode('UTF-8').gsub(/\s+/, ' ').strip
489
+ return body_text
490
+ end
491
+ end
492
+ end
493
+ nil
494
+ end
495
+
496
+ private
497
+
498
+ def message_found?(given, needed)
499
+ given.to_s.upcase.include? needed.to_s.upcase
500
+ end
501
+ end
502
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'email_account/mail_account'
4
+
5
+ module OnlyofficeGmailHelper
6
+ # Class for storing default mail accounts
7
+ class EmailAccount
8
+ # Read default values for account
9
+ # @return [Hash] result
10
+ def self.read_defaults
11
+ return read_env_defaults if read_env_defaults
12
+
13
+ yaml = YAML.load_file("#{Dir.home}/.gem-onlyoffice_gmail_helper/config.yml")
14
+ { user: yaml['user'], password: yaml['password'] }
15
+ rescue Errno::ENOENT
16
+ raise Errno::ENOENT, 'No config found. Please create ~/.gem-onlyoffice_gmail_helper/config.yml'
17
+ end
18
+
19
+ # Read keys from env variables
20
+ # @return [Hash]
21
+ def self.read_env_defaults
22
+ return false unless ENV['GMAIL_USER'] && ENV['GMAIL_PASSWORD']
23
+
24
+ { user: ENV['GMAIL_USER'], password: ENV['GMAIL_PASSWORD'] }
25
+ end
26
+
27
+ # @return [MailAccount] default account
28
+ GMAIL_DEFAULT = MailAccount.new(read_defaults[:user], read_defaults[:password])
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeGmailHelper
4
+ # Class for storing mail account data
5
+ class MailAccount
6
+ # @return [String] user name
7
+ attr_accessor :username
8
+ alias login username
9
+ # @return [String] user password
10
+ attr_accessor :password
11
+
12
+ def initialize(user, pass)
13
+ @username = user
14
+ @password = pass
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeGmailHelper
4
+ # Class for working with single message
5
+ class MailMessage
6
+ # @return [String] mail title
7
+ attr_accessor :title
8
+ # @return [String] mail content
9
+ attr_accessor :content
10
+ # @return [String] reply to field
11
+ attr_accessor :reply_to
12
+ # @return [String] date field
13
+ attr_accessor :date
14
+ # @return [String] tags field
15
+ attr_accessor :tags
16
+
17
+ def initialize(title, content = nil, reply_to = nil, date = nil, tags = nil)
18
+ @title = title
19
+ @content = content
20
+ @reply_to = reply_to
21
+ unless @content.nil? && !content.is_a?(Regexp)
22
+ begin
23
+ @content.delete!("\n")
24
+ rescue StandardError
25
+ Exception
26
+ end
27
+ begin
28
+ @content.gsub!("\r\n", '')
29
+ rescue StandardError
30
+ Exception
31
+ end
32
+ begin
33
+ @content.gsub!("\n\n", '')
34
+ rescue StandardError
35
+ Exception
36
+ end
37
+ begin
38
+ @content.gsub!('&#8220;', '"')
39
+ rescue StandardError
40
+ Exception
41
+ end
42
+ begin
43
+ @content.gsub!('&#8221;', '"')
44
+ rescue StandardError
45
+ Exception
46
+ end
47
+ begin
48
+ @content.tr!("\r", ' ')
49
+ rescue StandardError
50
+ Exception
51
+ end
52
+ end
53
+ @date = date
54
+ @tags = tags
55
+ end
56
+
57
+ # Compare message with other
58
+ # @param [MailMessage] other to compare
59
+ # @return [Boolean] result
60
+ def ==(other)
61
+ compare_title = (title.delete("\n") == other.title.delete("\n"))
62
+ compare_body = true
63
+ compare_body = false if (StaticDataTeamLab.check_email_body if defined?(StaticDataTeamLab.check_email_body)) && compare_title && (other.content =~ content).nonzero?
64
+ compare_title && compare_body
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Main namespace of gem
4
+ module OnlyofficeGmailHelper
5
+ # @return [String] name of gem
6
+ NAME = 'onlyoffice_gmail_helper'
7
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeGmailHelper
4
+ # @return [String] versio of gem
5
+ VERSION = '0.2.0'
6
+ end
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: onlyoffice_gmail_helper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - ONLYOFFICE
8
+ - Pavel Lobashov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2021-01-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: gmail
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '0.6'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '0.6'
28
+ - !ruby/object:Gem::Dependency
29
+ name: onlyoffice_logger_helper
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1'
42
+ - !ruby/object:Gem::Dependency
43
+ name: overcommit
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '13'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '13'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '3'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '3'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rubocop
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '1'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rubocop-performance
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rubocop-rake
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rubocop-rspec
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '2'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '2'
140
+ - !ruby/object:Gem::Dependency
141
+ name: simplecov
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: yard
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: 0.9.20
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: 0.9.20
174
+ description: ONLYOFFICE Helper Gem for GMail. Used in QA
175
+ email:
176
+ - shockwavenn@gmail.com
177
+ executables: []
178
+ extensions: []
179
+ extra_rdoc_files: []
180
+ files:
181
+ - lib/onlyoffice_gmail_helper.rb
182
+ - lib/onlyoffice_gmail_helper/email_account.rb
183
+ - lib/onlyoffice_gmail_helper/email_account/mail_account.rb
184
+ - lib/onlyoffice_gmail_helper/mail_message.rb
185
+ - lib/onlyoffice_gmail_helper/name.rb
186
+ - lib/onlyoffice_gmail_helper/version.rb
187
+ homepage: https://github.com/ONLYOFFICE-QA/onlyoffice_gmail_helper
188
+ licenses:
189
+ - AGPL-3.0
190
+ metadata:
191
+ bug_tracker_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_gmail_helper/issues
192
+ changelog_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_gmail_helper/blob/master/CHANGELOG.md
193
+ documentation_uri: https://www.rubydoc.info/gems/onlyoffice_gmail_helper
194
+ homepage_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_gmail_helper
195
+ source_code_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_gmail_helper
196
+ post_install_message:
197
+ rdoc_options: []
198
+ require_paths:
199
+ - lib
200
+ required_ruby_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '2.5'
205
+ required_rubygems_version: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ requirements: []
211
+ rubygems_version: 3.1.4
212
+ signing_key:
213
+ specification_version: 4
214
+ summary: ONLYOFFICE Helper Gem for GMail
215
+ test_files: []