teems 0.3.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +78 -0
  3. data/README.md +84 -0
  4. data/bin/teems +8 -1
  5. data/lib/teems/api/calendar.rb +45 -14
  6. data/lib/teems/api/client.rb +19 -4
  7. data/lib/teems/api/mail.rb +132 -0
  8. data/lib/teems/api/mail_actions.rb +22 -0
  9. data/lib/teems/api/mail_rules.rb +24 -0
  10. data/lib/teems/cli.rb +2 -0
  11. data/lib/teems/commands/base.rb +31 -7
  12. data/lib/teems/commands/cal.rb +109 -28
  13. data/lib/teems/commands/cal_ics.rb +47 -0
  14. data/lib/teems/commands/confirmation.rb +19 -0
  15. data/lib/teems/commands/help.rb +4 -0
  16. data/lib/teems/commands/mail.rb +207 -0
  17. data/lib/teems/commands/mail_decrypting.rb +46 -0
  18. data/lib/teems/commands/mail_help.rb +85 -0
  19. data/lib/teems/commands/mail_rules.rb +201 -0
  20. data/lib/teems/commands/mail_sync.rb +92 -0
  21. data/lib/teems/commands/mail_thread.rb +87 -0
  22. data/lib/teems/commands/mail_triage.rb +241 -0
  23. data/lib/teems/commands/meet.rb +159 -0
  24. data/lib/teems/commands/meeting.rb +4 -3
  25. data/lib/teems/commands/messages.rb +51 -8
  26. data/lib/teems/commands/sync.rb +45 -11
  27. data/lib/teems/commands/sync_folders.rb +118 -0
  28. data/lib/teems/commands/transcripts.rb +205 -137
  29. data/lib/teems/formatters/format_utils.rb +26 -2
  30. data/lib/teems/formatters/html_entities.rb +49 -0
  31. data/lib/teems/formatters/html_text.rb +181 -0
  32. data/lib/teems/formatters/ics_format.rb +112 -0
  33. data/lib/teems/formatters/link_cleaner.rb +91 -0
  34. data/lib/teems/formatters/link_collector.rb +70 -0
  35. data/lib/teems/formatters/mail_formatter.rb +58 -0
  36. data/lib/teems/formatters/mail_markdown.rb +70 -0
  37. data/lib/teems/formatters/mail_rule_formatter.rb +45 -0
  38. data/lib/teems/formatters/mail_rule_text.rb +67 -0
  39. data/lib/teems/formatters/markdown_formatter.rb +10 -1
  40. data/lib/teems/formatters/message_formatter.rb +7 -2
  41. data/lib/teems/formatters/output.rb +45 -8
  42. data/lib/teems/formatters/transcript_markdown.rb +16 -12
  43. data/lib/teems/models/chat.rb +19 -5
  44. data/lib/teems/models/event.rb +1 -23
  45. data/lib/teems/models/event_display.rb +40 -0
  46. data/lib/teems/models/ics_event.rb +60 -0
  47. data/lib/teems/models/inline_image.rb +83 -0
  48. data/lib/teems/models/mail_conversation.rb +62 -0
  49. data/lib/teems/models/mail_encryption.rb +41 -0
  50. data/lib/teems/models/mail_folder.rb +44 -0
  51. data/lib/teems/models/mail_message.rb +152 -0
  52. data/lib/teems/models/mail_rule.rb +38 -0
  53. data/lib/teems/models/message.rb +7 -4
  54. data/lib/teems/models/parsing.rb +5 -0
  55. data/lib/teems/runner.rb +11 -0
  56. data/lib/teems/services/api_client.rb +23 -11
  57. data/lib/teems/services/browser.rb +17 -0
  58. data/lib/teems/services/clipboard.rb +17 -0
  59. data/lib/teems/services/inline_image_downloader.rb +115 -0
  60. data/lib/teems/services/mail_folders.rb +76 -0
  61. data/lib/teems/services/mail_id_cache.rb +51 -0
  62. data/lib/teems/services/mail_legacy_files.rb +96 -0
  63. data/lib/teems/services/mail_sync_attachments.rb +103 -0
  64. data/lib/teems/services/mail_sync_engine.rb +98 -0
  65. data/lib/teems/services/mail_sync_folder.rb +142 -0
  66. data/lib/teems/services/mail_sync_store.rb +116 -0
  67. data/lib/teems/services/smime_content.rb +36 -0
  68. data/lib/teems/services/smime_decryptor.rb +36 -0
  69. data/lib/teems/services/sync_dir_naming.rb +16 -10
  70. data/lib/teems/services/sync_dir_ownership.rb +111 -0
  71. data/lib/teems/services/sync_dir_planning.rb +130 -0
  72. data/lib/teems/services/sync_engine.rb +13 -7
  73. data/lib/teems/services/sync_images.rb +55 -0
  74. data/lib/teems/services/sync_store.rb +20 -43
  75. data/lib/teems/services/token_extractor.rb +4 -0
  76. data/lib/teems/support/control_chars.rb +19 -0
  77. data/lib/teems/support/mime_header.rb +61 -0
  78. data/lib/teems/support/mime_part.rb +97 -0
  79. data/lib/teems/support/signed_data.rb +23 -0
  80. data/lib/teems/support/subprocess.rb +2 -0
  81. data/lib/teems/support/time_parsing.rb +9 -1
  82. data/lib/teems/version.rb +1 -1
  83. data/lib/teems.rb +67 -2
  84. metadata +51 -1
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+
5
+ module Teems
6
+ module Support
7
+ # The content inside an opaque S/MIME signature (PKCS #7 signed-data). The signature is not
8
+ # checked: this only unwraps it so the message can be read.
9
+ module SignedData
10
+ module_function
11
+
12
+ def content(der)
13
+ envelope = OpenSSL::PKCS7.new(der)
14
+ raise Error, 'This message is encrypted again inside; teems opens one layer' unless envelope.type == :signed
15
+
16
+ envelope.verify([], OpenSSL::X509::Store.new, nil, OpenSSL::PKCS7::NOVERIFY | OpenSSL::PKCS7::NOSIGS)
17
+ envelope.data.to_s
18
+ rescue OpenSSL::PKCS7::PKCS7Error, ArgumentError => e
19
+ raise Error, "Could not read the signed content: #{e.message}"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -17,6 +17,8 @@ module Teems
17
17
  module Subprocess
18
18
  module_function
19
19
 
20
+ # Named after Open3.capture3, which it wraps with the same signature and return value
21
+ # :reek:UncommunicativeMethodName
20
22
  def capture3(*command)
21
23
  previous = Thread.report_on_exception
22
24
  Thread.report_on_exception = false
@@ -3,17 +3,25 @@
3
3
  module Teems
4
4
  module Support
5
5
  # Shared time-input parsing for commands that accept schedule inputs
6
- # like "HH:MM", "today HH:MM", "tomorrow HH:MM", and "YYYY-MM-DD HH:MM".
6
+ # like "now", "HH:MM", "today HH:MM", "tomorrow HH:MM", and "YYYY-MM-DD HH:MM".
7
7
  module TimeParsing
8
8
  private
9
9
 
10
10
  def parse_time_input(raw)
11
+ return current_minute if raw.strip.casecmp?('now')
12
+
11
13
  date, time_str = split_time_input(raw)
12
14
  return unless time_str
13
15
 
14
16
  date.is_a?(String) ? parse_absolute_time(date, time_str) : parse_relative_time(date, time_str)
15
17
  end
16
18
 
19
+ # The start of the current minute, as "HH:MM" would give it
20
+ def current_minute
21
+ now = Time.now
22
+ Time.new(now.year, now.month, now.day, now.hour, now.min, 0)
23
+ end
24
+
17
25
  def split_time_input(raw)
18
26
  base = Date.today
19
27
  split_tomorrow_time(raw, base) || split_today_time(raw, base) || split_absolute_time(raw)
data/lib/teems/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Teems
4
- VERSION = '0.3.2'
4
+ VERSION = '0.8.0'
5
5
  end
data/lib/teems.rb CHANGED
@@ -16,10 +16,12 @@ module Teems
16
16
 
17
17
  # Error raised when a Teams API request fails (4xx/5xx responses)
18
18
  class ApiError < Error
19
- attr_reader :status_code
19
+ # error_code is the service's own code (Graph's error.code, e.g. "syncStateNotFound")
20
+ attr_reader :status_code, :error_code
20
21
 
21
- def initialize(message = nil, status_code: nil)
22
+ def initialize(message = nil, status_code: nil, error_code: nil)
22
23
  @status_code = status_code
24
+ @error_code = error_code
23
25
  super(message)
24
26
  end
25
27
 
@@ -48,11 +50,21 @@ module Teems
48
50
  autoload :Channel, 'teems/models/channel'
49
51
  autoload :Chat, 'teems/models/chat'
50
52
  autoload :Event, 'teems/models/event'
53
+ autoload :IcsEvent, 'teems/models/ics_event'
54
+ autoload :EventDisplay, 'teems/models/event_display'
51
55
  autoload :Message, 'teems/models/message'
56
+ autoload :InlineImage, 'teems/models/inline_image'
57
+ autoload :InlineImageParsing, 'teems/models/inline_image'
52
58
  autoload :Parsing, 'teems/models/parsing'
53
59
  autoload :User, 'teems/models/user'
54
60
  autoload :UserProfile, 'teems/models/user_profile'
55
61
  autoload :Duration, 'teems/models/duration'
62
+ autoload :MailFolder, 'teems/models/mail_folder'
63
+ autoload :MailMessage, 'teems/models/mail_message'
64
+ autoload :MailConversation, 'teems/models/mail_conversation'
65
+ autoload :MailEncryption, 'teems/models/mail_encryption'
66
+ autoload :MailRule, 'teems/models/mail_rule'
67
+ autoload :MAIL_RULE_SENDING_ACTIONS, 'teems/models/mail_rule'
56
68
  end
57
69
 
58
70
  # Application services for configuration, caching, and API communication
@@ -64,11 +76,28 @@ module Teems
64
76
  autoload :TokenRefresher, 'teems/services/token_refresher'
65
77
  autoload :CacheStore, 'teems/services/cache_store'
66
78
  autoload :FileDownloader, 'teems/services/file_downloader'
79
+ autoload :InlineImageDownloader, 'teems/services/inline_image_downloader'
67
80
  autoload :TeamsUrlParser, 'teems/services/teams_url_parser'
68
81
  autoload :SyncStore, 'teems/services/sync_store'
82
+ autoload :SyncFileOps, 'teems/services/sync_store'
69
83
  autoload :SyncDirNaming, 'teems/services/sync_dir_naming'
84
+ autoload :SyncDirOwnership, 'teems/services/sync_dir_ownership'
85
+ autoload :SyncDirPlanning, 'teems/services/sync_dir_planning'
70
86
  autoload :SafariJsRunner, 'teems/services/safari_js_runner'
71
87
  autoload :SyncEngine, 'teems/services/sync_engine'
88
+ autoload :SyncImages, 'teems/services/sync_images'
89
+ autoload :MailFolders, 'teems/services/mail_folders'
90
+ autoload :MailIdCache, 'teems/services/mail_id_cache'
91
+ autoload :Browser, 'teems/services/browser'
92
+ autoload :Clipboard, 'teems/services/clipboard'
93
+ autoload :SmimeContent, 'teems/services/smime_content'
94
+ autoload :SmimeDecryptor, 'teems/services/smime_decryptor'
95
+ autoload :MailLegacyFiles, 'teems/services/mail_legacy_files'
96
+ autoload :MailSyncAttachments, 'teems/services/mail_sync_attachments'
97
+ autoload :MailSyncEngine, 'teems/services/mail_sync_engine'
98
+ autoload :MailSyncFolder, 'teems/services/mail_sync_folder'
99
+ autoload :MailSyncIndex, 'teems/services/mail_sync_folder'
100
+ autoload :MailSyncStore, 'teems/services/mail_sync_store'
72
101
  end
73
102
 
74
103
  # Output formatters for messages and terminal output
@@ -78,7 +107,19 @@ module Teems
78
107
  autoload :MessageFormatter, 'teems/formatters/message_formatter'
79
108
  autoload :MarkdownFormatter, 'teems/formatters/markdown_formatter'
80
109
  autoload :CalendarFormatter, 'teems/formatters/calendar_formatter'
110
+ autoload :IcsFormat, 'teems/formatters/ics_format'
81
111
  autoload :TranscriptMarkdown, 'teems/formatters/transcript_markdown'
112
+ autoload :HtmlEntities, 'teems/formatters/html_entities'
113
+ autoload :HtmlTags, 'teems/formatters/html_text'
114
+ autoload :HtmlText, 'teems/formatters/html_text'
115
+ autoload :TextBuffer, 'teems/formatters/html_text'
116
+ autoload :LinkCleaner, 'teems/formatters/link_cleaner'
117
+ autoload :LinkCollector, 'teems/formatters/link_collector'
118
+ autoload :MailDates, 'teems/formatters/mail_formatter'
119
+ autoload :MailFormatter, 'teems/formatters/mail_formatter'
120
+ autoload :MailMarkdown, 'teems/formatters/mail_markdown'
121
+ autoload :MailRuleText, 'teems/formatters/mail_rule_text'
122
+ autoload :MailRuleFormatter, 'teems/formatters/mail_rule_formatter'
82
123
  end
83
124
 
84
125
  # CLI commands implementing user-facing functionality
@@ -87,17 +128,33 @@ module Teems
87
128
  autoload :Activity, 'teems/commands/activity'
88
129
  autoload :Auth, 'teems/commands/auth'
89
130
  autoload :Cal, 'teems/commands/cal'
131
+ autoload :CalIcsExport, 'teems/commands/cal_ics'
90
132
  autoload :Channels, 'teems/commands/channels'
91
133
  autoload :Chats, 'teems/commands/chats'
92
134
  autoload :Messages, 'teems/commands/messages'
93
135
  autoload :Sync, 'teems/commands/sync'
136
+ autoload :SyncFolders, 'teems/commands/sync_folders'
94
137
  autoload :Help, 'teems/commands/help'
95
138
  autoload :Who, 'teems/commands/who'
96
139
  autoload :Ooo, 'teems/commands/ooo'
97
140
  autoload :Org, 'teems/commands/org'
98
141
  autoload :Meeting, 'teems/commands/meeting'
142
+ autoload :Meet, 'teems/commands/meet'
99
143
  autoload :Transcripts, 'teems/commands/transcripts'
100
144
  autoload :Status, 'teems/commands/status'
145
+ autoload :Mail, 'teems/commands/mail'
146
+ autoload :MailReading, 'teems/commands/mail'
147
+ autoload :MailDecrypting, 'teems/commands/mail_decrypting'
148
+ autoload :MailThread, 'teems/commands/mail_thread'
149
+ autoload :MailTriage, 'teems/commands/mail_triage'
150
+ autoload :MailDueDate, 'teems/commands/mail_triage'
151
+ autoload :MailSelection, 'teems/commands/mail_triage'
152
+ autoload :MailHelp, 'teems/commands/mail_help'
153
+ autoload :MailRules, 'teems/commands/mail_rules'
154
+ autoload :MailRuleOptions, 'teems/commands/mail_rules'
155
+ autoload :MailRuleBuilder, 'teems/commands/mail_rules'
156
+ autoload :Confirmation, 'teems/commands/confirmation'
157
+ autoload :MailSyncing, 'teems/commands/mail_sync'
101
158
  end
102
159
 
103
160
  # Thin wrappers around Teams API endpoints
@@ -107,6 +164,10 @@ module Teems
107
164
  autoload :Channels, 'teems/api/channels'
108
165
  autoload :Chats, 'teems/api/chats'
109
166
  autoload :Files, 'teems/api/files'
167
+ autoload :Mail, 'teems/api/mail'
168
+ autoload :MailActions, 'teems/api/mail_actions'
169
+ autoload :MailRules, 'teems/api/mail_rules'
170
+ autoload :MailPaths, 'teems/api/mail'
110
171
  autoload :Meetings, 'teems/api/meetings'
111
172
  autoload :Messages, 'teems/api/messages'
112
173
  autoload :Users, 'teems/api/users'
@@ -120,5 +181,9 @@ module Teems
120
181
  autoload :Timezone, 'teems/support/timezone'
121
182
  autoload :TimeParsing, 'teems/support/time_parsing'
122
183
  autoload :Subprocess, 'teems/support/subprocess'
184
+ autoload :MimeHeader, 'teems/support/mime_header'
185
+ autoload :MimePart, 'teems/support/mime_part'
186
+ autoload :SignedData, 'teems/support/signed_data'
187
+ autoload :ControlChars, 'teems/support/control_chars'
123
188
  end
124
189
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: teems
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Boehs
@@ -28,6 +28,9 @@ files:
28
28
  - lib/teems/api/chats.rb
29
29
  - lib/teems/api/client.rb
30
30
  - lib/teems/api/files.rb
31
+ - lib/teems/api/mail.rb
32
+ - lib/teems/api/mail_actions.rb
33
+ - lib/teems/api/mail_rules.rb
31
34
  - lib/teems/api/meetings.rb
32
35
  - lib/teems/api/messages.rb
33
36
  - lib/teems/api/users.rb
@@ -38,9 +41,19 @@ files:
38
41
  - lib/teems/commands/auth.rb
39
42
  - lib/teems/commands/base.rb
40
43
  - lib/teems/commands/cal.rb
44
+ - lib/teems/commands/cal_ics.rb
41
45
  - lib/teems/commands/channels.rb
42
46
  - lib/teems/commands/chats.rb
47
+ - lib/teems/commands/confirmation.rb
43
48
  - lib/teems/commands/help.rb
49
+ - lib/teems/commands/mail.rb
50
+ - lib/teems/commands/mail_decrypting.rb
51
+ - lib/teems/commands/mail_help.rb
52
+ - lib/teems/commands/mail_rules.rb
53
+ - lib/teems/commands/mail_sync.rb
54
+ - lib/teems/commands/mail_thread.rb
55
+ - lib/teems/commands/mail_triage.rb
56
+ - lib/teems/commands/meet.rb
44
57
  - lib/teems/commands/meeting.rb
45
58
  - lib/teems/commands/meeting_recording.rb
46
59
  - lib/teems/commands/meeting_transcript.rb
@@ -49,10 +62,20 @@ files:
49
62
  - lib/teems/commands/org.rb
50
63
  - lib/teems/commands/status.rb
51
64
  - lib/teems/commands/sync.rb
65
+ - lib/teems/commands/sync_folders.rb
52
66
  - lib/teems/commands/transcripts.rb
53
67
  - lib/teems/commands/who.rb
54
68
  - lib/teems/formatters/calendar_formatter.rb
55
69
  - lib/teems/formatters/format_utils.rb
70
+ - lib/teems/formatters/html_entities.rb
71
+ - lib/teems/formatters/html_text.rb
72
+ - lib/teems/formatters/ics_format.rb
73
+ - lib/teems/formatters/link_cleaner.rb
74
+ - lib/teems/formatters/link_collector.rb
75
+ - lib/teems/formatters/mail_formatter.rb
76
+ - lib/teems/formatters/mail_markdown.rb
77
+ - lib/teems/formatters/mail_rule_formatter.rb
78
+ - lib/teems/formatters/mail_rule_text.rb
56
79
  - lib/teems/formatters/markdown_formatter.rb
57
80
  - lib/teems/formatters/message_formatter.rb
58
81
  - lib/teems/formatters/output.rb
@@ -62,20 +85,43 @@ files:
62
85
  - lib/teems/models/chat.rb
63
86
  - lib/teems/models/duration.rb
64
87
  - lib/teems/models/event.rb
88
+ - lib/teems/models/event_display.rb
89
+ - lib/teems/models/ics_event.rb
90
+ - lib/teems/models/inline_image.rb
91
+ - lib/teems/models/mail_conversation.rb
92
+ - lib/teems/models/mail_encryption.rb
93
+ - lib/teems/models/mail_folder.rb
94
+ - lib/teems/models/mail_message.rb
95
+ - lib/teems/models/mail_rule.rb
65
96
  - lib/teems/models/message.rb
66
97
  - lib/teems/models/parsing.rb
67
98
  - lib/teems/models/user.rb
68
99
  - lib/teems/models/user_profile.rb
69
100
  - lib/teems/runner.rb
70
101
  - lib/teems/services/api_client.rb
102
+ - lib/teems/services/browser.rb
71
103
  - lib/teems/services/cache_store.rb
104
+ - lib/teems/services/clipboard.rb
72
105
  - lib/teems/services/configuration.rb
73
106
  - lib/teems/services/file_downloader.rb
74
107
  - lib/teems/services/headless_extract.rb
108
+ - lib/teems/services/inline_image_downloader.rb
109
+ - lib/teems/services/mail_folders.rb
110
+ - lib/teems/services/mail_id_cache.rb
111
+ - lib/teems/services/mail_legacy_files.rb
112
+ - lib/teems/services/mail_sync_attachments.rb
113
+ - lib/teems/services/mail_sync_engine.rb
114
+ - lib/teems/services/mail_sync_folder.rb
115
+ - lib/teems/services/mail_sync_store.rb
75
116
  - lib/teems/services/safari_js_runner.rb
76
117
  - lib/teems/services/safari_oauth.rb
118
+ - lib/teems/services/smime_content.rb
119
+ - lib/teems/services/smime_decryptor.rb
77
120
  - lib/teems/services/sync_dir_naming.rb
121
+ - lib/teems/services/sync_dir_ownership.rb
122
+ - lib/teems/services/sync_dir_planning.rb
78
123
  - lib/teems/services/sync_engine.rb
124
+ - lib/teems/services/sync_images.rb
79
125
  - lib/teems/services/sync_store.rb
80
126
  - lib/teems/services/teams_url_parser.rb
81
127
  - lib/teems/services/token_exchange_scripts.rb
@@ -83,8 +129,12 @@ files:
83
129
  - lib/teems/services/token_extractor_scripts.rb
84
130
  - lib/teems/services/token_refresher.rb
85
131
  - lib/teems/services/token_store.rb
132
+ - lib/teems/support/control_chars.rb
86
133
  - lib/teems/support/error_logger.rb
87
134
  - lib/teems/support/help_formatter.rb
135
+ - lib/teems/support/mime_header.rb
136
+ - lib/teems/support/mime_part.rb
137
+ - lib/teems/support/signed_data.rb
88
138
  - lib/teems/support/subprocess.rb
89
139
  - lib/teems/support/time_parsing.rb
90
140
  - lib/teems/support/timezone.rb