zoom_slack 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c1ef070b91f2106a719a6692ec1dc922a7eb92b3
4
- data.tar.gz: 6fa3e4c5fcaa389a623fa0b1419dd0401c3cb3e1
3
+ metadata.gz: c988264e9d02b36a62478a8770a6cb06bd9c25f7
4
+ data.tar.gz: de22aaf7767abdd2b2c5f71d15bfb52b410cd3cb
5
5
  SHA512:
6
- metadata.gz: 6e975763ae19ebd3c87674117da6ca35b44a6d09b58520bd770933ce6e1b038e176e5236283912a1f5270223f6c8fc1216ec5cd25b71cb2de7c3f18f8d00a2c0
7
- data.tar.gz: 40f1e2584259d236eb61530477a8c9d9a5ec8ef787c387a7925394e3936e6e52fb3f6de01871f61ce61df3085a5623b6032d6eff49171a08eb50947b8f710426
6
+ metadata.gz: 9728a25b33faa268f901a7b0e862bc7dd8438eadc88ce7adda9b965d93968a477be90284c3e3ffbc36bcf14635c749f8d4cd903e33c3b758c6f66a37dbfdfd9e
7
+ data.tar.gz: cfd2725c38c3b28dc641fc48fd32500c26d75150af8121d4e6da642e2946d2b8f3fa605cbfe0c9411032261d5ee1161e1f70d915965eb526429767d38bc1dd8f
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  .env.local
2
2
  Gemfile.lock
3
3
  pkg/
4
+ spec/examples.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.4.5
data/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## Unreleased
8
+ ### Added
9
+ - Fully configurable via `bin/zoom_slack`. Run `zoom_slack -h` to see all the options.
10
+ - Full test coverage.
11
+
12
+ ## [0.0.1] - 2018-11-29
8
13
  ### Added
9
14
  - Initial version, working on Mac.
data/README.md CHANGED
@@ -1,5 +1,10 @@
1
+ [![Gem Version](https://badge.fury.io/rb/zoom_slack.svg)](https://badge.fury.io/rb/zoom_slack)
2
+ [![Build Status](https://travis-ci.org/bwebster/zoom_slack.svg?branch=master)](https://travis-ci.org/bwebster/zoom_slack)
3
+
1
4
  # zoom_slack
2
5
 
6
+ **Note: this is alpha quality software, and still under active development!**
7
+
3
8
  This gem provides an easy way to automatically set your Slack status any time you are in a Zoom meeting.
4
9
 
5
10
  The current implementation will only work on Mac OS X, but other operating system implementations are welcome!
@@ -30,3 +35,10 @@ You can obtain an oauth token by creating a new app and installing it into your
30
35
  1. Under the "Settings" sidebar, click "Install App", then click "Install App to Workspace"
31
36
  1. Click "Authorize"
32
37
  1. Copy you OAuth Access Token
38
+
39
+ ## Todo
40
+
41
+ 1. Tests!
42
+ 1. Customizable text, emoji, and expiration
43
+ 1. Documentation
44
+ 1. Support for additional platforms
data/Rakefile CHANGED
@@ -1,3 +1,6 @@
1
+ require "rspec/core/rake_task"
1
2
  require "bundler/gem_tasks"
2
3
 
4
+ RSpec::Core::RakeTask.new
5
+
3
6
  task default: :spec
data/bin/zoom_slack CHANGED
@@ -1,8 +1,53 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "optparse"
4
5
  require "zoom_slack"
5
6
 
6
- token = ARGV[0] || ENV.fetch("SLACK_API_TOKEN")
7
+ config = ZoomSlack::Config.new
7
8
 
8
- ZoomSlack::Syncer.new(token: token).sync
9
+ OptionParser.new do |opts|
10
+ opts.banner = "Usage: zoom_slack [options]"
11
+
12
+ opts.separator ""
13
+ opts.separator "Authentication options:"
14
+
15
+ opts.on("-t", "--token TOKEN",
16
+ "Slack token (defaults to $#{ZoomSlack::Config::TOKEN_DEFAULT_ENV})") do |v|
17
+ config.token = v
18
+ end
19
+
20
+ opts.separator ""
21
+ opts.separator "Profile status options:"
22
+
23
+ opts.on("--text TEXT",
24
+ "Status text (defaults to '#{ZoomSlack::Config::MEETING_TEXT_DEFAULT}')") do |v|
25
+ config.meeting_text = v
26
+ end
27
+ opts.on("--emoji EMOJI",
28
+ "Status emoji (defaults to '#{ZoomSlack::Config::MEETING_EMOJI_DEFAULT}')") do |v|
29
+ config.meeting_emoji = v
30
+ end
31
+ opts.on("--expires N",
32
+ "Status expires in N minutes (defaults to #{ZoomSlack::Config::MEETING_EXPIRES_IN_MIN_DEFAULT})") do |v|
33
+ config.meeting_expires_in_min = v
34
+ end
35
+ opts.on("--clear-text TEXT",
36
+ "Clear status text (defaults to '#{ZoomSlack::Config::CLEAR_TEXT_DEFAULT}')") do |v|
37
+ config.clear_text = v
38
+ end
39
+ opts.on("--clear-emoji EMOJI",
40
+ "Clear status emoji (defaults to '#{ZoomSlack::Config::CLEAR_EMOJI_DEFAULT}')") do |v|
41
+ config.clear_emoji = v
42
+ end
43
+
44
+ opts.separator ""
45
+ opts.separator "Common options:"
46
+
47
+ opts.on_tail("-h", "--help", "Show this message") do
48
+ puts opts
49
+ exit
50
+ end
51
+ end.parse!
52
+
53
+ ZoomSlack::Syncer.new(config).sync
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZoomSlack
4
+ class Config
5
+ TOKEN_DEFAULT_ENV = "SLACK_API_TOKEN"
6
+ MEETING_TEXT_DEFAULT = "In a meeting"
7
+ MEETING_EMOJI_DEFAULT = ":spiral_calendar_pad:"
8
+ MEETING_EXPIRES_IN_MIN_DEFAULT = 0
9
+ CLEAR_TEXT_DEFAULT = nil
10
+ CLEAR_EMOJI_DEFAULT = nil
11
+
12
+ attr_accessor :token,
13
+ :meeting_text, :meeting_emoji, :meeting_expires_in_min,
14
+ :clear_text, :clear_emoji
15
+
16
+ def initialize
17
+ self.token = ENV[TOKEN_DEFAULT_ENV]
18
+ self.meeting_text = MEETING_TEXT_DEFAULT
19
+ self.meeting_emoji = MEETING_EMOJI_DEFAULT
20
+ self.meeting_expires_in_min = MEETING_EXPIRES_IN_MIN_DEFAULT
21
+ self.clear_text = CLEAR_TEXT_DEFAULT
22
+ self.clear_emoji = CLEAR_EMOJI_DEFAULT
23
+ end
24
+
25
+ def meeting_expires_in_min=(min)
26
+ @meeting_expires_in_min = Integer(min)
27
+ end
28
+
29
+ def meeting_expires_at
30
+ return nil if meeting_expires_in_min == 0
31
+
32
+ Time.now.to_i + (meeting_expires_in_min * 60)
33
+ end
34
+ end
35
+ end
@@ -6,5 +6,11 @@ module ZoomSlack
6
6
  def self.for_platform
7
7
  Mac.new
8
8
  end
9
+
10
+ class Base
11
+ def running?
12
+ raise NotImplementedError
13
+ end
14
+ end
9
15
  end
10
16
  end
@@ -1,10 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "tmpdir"
4
+ require "open3"
4
5
 
5
6
  module ZoomSlack
6
7
  module ProcessDetector
7
- class Mac
8
+ class Mac < Base
9
+ SCRIPT = "in_zoom_meeting.applescript"
10
+ COMPILED_SCRIPT = "in_zoom_meeting.scptd"
11
+
12
+ def initialize(open: Open3)
13
+ self.open = open
14
+ end
15
+
8
16
  def running?
9
17
  compile
10
18
  process_running?
@@ -12,20 +20,26 @@ module ZoomSlack
12
20
 
13
21
  private
14
22
 
23
+ attr_accessor :open
24
+
15
25
  def compile
16
- `osacompile -o #{bin_path} #{source_path}` unless Dir.exist?(bin_path)
26
+ return if Dir.exist?(compiled_path)
27
+
28
+ out, _err, _st = open.capture3("osacompile", "-o", compiled_path, source_path)
29
+ out
17
30
  end
18
31
 
19
32
  def process_running?
20
- `osascript #{bin_path}`.chomp == "true"
33
+ out, _err, _st = open.capture3("osascript", compiled_path)
34
+ out.chomp == "true"
21
35
  end
22
36
 
23
- def bin_path
24
- @bin_path ||= File.join(Dir.tmpdir, "in_zoom_meeting.scptd")
37
+ def compiled_path
38
+ @bin_path ||= File.join(Dir.tmpdir, COMPILED_SCRIPT)
25
39
  end
26
40
 
27
41
  def source_path
28
- @source_path ||= File.join(File.dirname(__FILE__), "source", "in_zoom_meeting.applescript")
42
+ @source_path ||= File.join(File.dirname(__FILE__), "source", SCRIPT)
29
43
  end
30
44
  end
31
45
  end
@@ -5,8 +5,9 @@ require "json"
5
5
 
6
6
  module ZoomSlack
7
7
  class ProfileUpdater
8
- def initialize(token:)
8
+ def initialize(token:, stderr: STDERR)
9
9
  self.token = token
10
+ self.stderr = stderr
10
11
  end
11
12
 
12
13
  def status(status)
@@ -15,7 +16,7 @@ module ZoomSlack
15
16
 
16
17
  private
17
18
 
18
- attr_accessor :token
19
+ attr_accessor :token, :stderr
19
20
 
20
21
  def update_profile(status)
21
22
  response = connection.post do |req|
@@ -32,7 +33,7 @@ module ZoomSlack
32
33
 
33
34
  def human_readable_error(response)
34
35
  json = JSON.parse(response.body)
35
- puts "Unable to update Slack profile. Did you pass in the right token?" unless json.fetch("ok")
36
+ stderr.print "Unable to update Slack profile. Did you pass in the right token?\n" unless json.fetch("ok")
36
37
  end
37
38
 
38
39
  def connection
@@ -2,9 +2,10 @@
2
2
 
3
3
  module ZoomSlack
4
4
  class Syncer
5
- def initialize(token:,
6
- profile_updater: ProfileUpdater.new(token: token),
5
+ def initialize(config,
6
+ profile_updater: ProfileUpdater.new(token: config.token),
7
7
  process_detector: ProcessDetector.for_platform)
8
+ self.config = config
8
9
  self.profile_updater = profile_updater
9
10
  self.process_detector = process_detector
10
11
  end
@@ -19,14 +20,14 @@ module ZoomSlack
19
20
 
20
21
  private
21
22
 
22
- attr_accessor :profile_updater, :process_detector
23
+ attr_accessor :config, :profile_updater, :process_detector
23
24
 
24
25
  def in_meeting_status
25
- Status.new(text: "In a meeting", emoji: ":spiral_calendar_pad:", expires: 0)
26
+ Status.new(text: config.meeting_text, emoji: config.meeting_emoji, expires: config.meeting_expires_at)
26
27
  end
27
28
 
28
29
  def clear_status
29
- Status.new
30
+ Status.new(text: config.clear_text, emoji: config.clear_emoji)
30
31
  end
31
32
  end
32
33
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ZoomSlack
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.2"
5
5
  end
data/lib/zoom_slack.rb CHANGED
@@ -3,7 +3,9 @@
3
3
  module ZoomSlack
4
4
  end
5
5
 
6
- require "zoom_slack/process_detector/factory"
6
+ require "zoom_slack/version"
7
+ require "zoom_slack/config"
8
+ require "zoom_slack/process_detector/base"
7
9
  require "zoom_slack/process_detector/mac"
8
10
  require "zoom_slack/profile_updater"
9
11
  require "zoom_slack/status"
data/zoom_slack.gemspec CHANGED
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ $:.unshift File.expand_path("../lib", __FILE__)
4
+ require "zoom_slack/version"
5
+
3
6
  Gem::Specification.new do |s|
4
7
  s.name = "zoom_slack"
5
- s.version = "0.0.1"
8
+ s.version = ZoomSlack::VERSION
6
9
  s.date = "2018-11-29"
7
10
  s.summary = "Zoom to Slack integration"
8
11
  s.description = "Automatically update your Slack status when you're in a Zoom meeting."
@@ -20,4 +23,9 @@ Gem::Specification.new do |s|
20
23
 
21
24
  s.add_development_dependency "bundler"
22
25
  s.add_development_dependency "rake"
26
+ s.add_development_dependency "rspec"
27
+ s.add_development_dependency "webmock"
28
+ s.add_development_dependency "timecop"
29
+ s.add_development_dependency "climate_control"
30
+ s.add_development_dependency "gem-release"
23
31
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zoom_slack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Burke Webster
@@ -66,6 +66,76 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: climate_control
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: gem-release
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
69
139
  description: Automatically update your Slack status when you're in a Zoom meeting.
70
140
  email: burke.webster@gmail.com
71
141
  executables:
@@ -74,7 +144,9 @@ extensions: []
74
144
  extra_rdoc_files: []
75
145
  files:
76
146
  - ".gitignore"
147
+ - ".rspec"
77
148
  - ".ruby-version"
149
+ - ".travis.yml"
78
150
  - CHANGELOG.md
79
151
  - Gemfile
80
152
  - LICENSE
@@ -82,7 +154,8 @@ files:
82
154
  - Rakefile
83
155
  - bin/zoom_slack
84
156
  - lib/zoom_slack.rb
85
- - lib/zoom_slack/process_detector/factory.rb
157
+ - lib/zoom_slack/config.rb
158
+ - lib/zoom_slack/process_detector/base.rb
86
159
  - lib/zoom_slack/process_detector/mac.rb
87
160
  - lib/zoom_slack/process_detector/source/in_zoom_meeting.applescript
88
161
  - lib/zoom_slack/profile_updater.rb