arisaid 0.3.1
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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/Gemfile +12 -0
- data/README.md +49 -0
- data/Rakefile +10 -0
- data/arisaid.gemspec +30 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/exe/arisaid +5 -0
- data/lib/arisaid.rb +40 -0
- data/lib/arisaid/bots.rb +23 -0
- data/lib/arisaid/cli.rb +40 -0
- data/lib/arisaid/client.rb +26 -0
- data/lib/arisaid/configurable.rb +101 -0
- data/lib/arisaid/core_ext/array.rb +12 -0
- data/lib/arisaid/core_ext/hash.rb +11 -0
- data/lib/arisaid/error.rb +5 -0
- data/lib/arisaid/faraday/request.rb +51 -0
- data/lib/arisaid/faraday/response.rb +35 -0
- data/lib/arisaid/guests.rb +24 -0
- data/lib/arisaid/syncable.rb +69 -0
- data/lib/arisaid/userable.rb +35 -0
- data/lib/arisaid/usergroups.rb +124 -0
- data/lib/arisaid/users.rb +24 -0
- data/lib/arisaid/version.rb +3 -0
- metadata +167 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d043e1310c3a44260fe7048e9322ac546810d916
|
4
|
+
data.tar.gz: c83236978f49d6a72d5a0c45db1672b50b8438c2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 659154b00f939ea404d8b06c6dcd5c2f193cd0e332102714dd83de47e34461cb748cc871610a6bc619ec142927621d42efd1aa58c9ec5994e0bd344884319e16
|
7
|
+
data.tar.gz: 09e4c6bce67dd5a28839b34a831caf4e4a9b08ff00f1375925943e164bba2ee1bd270ae60d5c5b18fb80457728ee76455b17d8e62d0e49179a336ad6df011333
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
Arisaid
|
2
|
+
=======
|
3
|
+
|
4
|
+
Arisaid is a configuration tool by YAML for Slack.
|
5
|
+
|
6
|
+
[][gem]
|
7
|
+
[][travis]
|
8
|
+
|
9
|
+
[gem]: https://rubygems.org/gems/arisaid
|
10
|
+
[travis]: https://travis-ci.org/pepabo/arisaid
|
11
|
+
|
12
|
+
Installation
|
13
|
+
------------
|
14
|
+
|
15
|
+
Install it yourself as:
|
16
|
+
|
17
|
+
```sh
|
18
|
+
$ gem install arisaid
|
19
|
+
```
|
20
|
+
|
21
|
+
Usage
|
22
|
+
-----
|
23
|
+
|
24
|
+
Command examples:
|
25
|
+
|
26
|
+
```
|
27
|
+
$ arisaid show usergroups -t [SLACK_TEAM] -p [SLACK_TOKEN] > usergroups.yml
|
28
|
+
$ cat usergroups.yml | arisaid apply usergroups -t [SLACK_TEAM] -p [SLACK_TOKEN]
|
29
|
+
$ arisaid save users
|
30
|
+
```
|
31
|
+
|
32
|
+
Development
|
33
|
+
-----------
|
34
|
+
|
35
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake false` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
36
|
+
|
37
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
38
|
+
|
39
|
+
Contributing
|
40
|
+
------------
|
41
|
+
|
42
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/pepabo/arisaid.
|
43
|
+
|
44
|
+
License
|
45
|
+
-------
|
46
|
+
|
47
|
+
The MIT License (MIT)
|
48
|
+
|
49
|
+
Copyright (c) 2015 GMO Pepabo, Inc.
|
data/Rakefile
ADDED
data/arisaid.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'arisaid/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "arisaid"
|
8
|
+
spec.version = Arisaid::VERSION
|
9
|
+
spec.authors = ["linyows"]
|
10
|
+
spec.email = ["linyows@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Slack configuration.}
|
13
|
+
spec.description = %q{Configure the slack by yaml files.}
|
14
|
+
spec.homepage = "https://github.com/pepabo/arisaid"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_dependency "breacan", "~> 0.6"
|
23
|
+
spec.add_dependency "thor"
|
24
|
+
spec.add_dependency "pit"
|
25
|
+
spec.add_dependency "colorize"
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
28
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
29
|
+
spec.add_development_dependency "minitest"
|
30
|
+
end
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "arisaid"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "pry"
|
14
|
+
Pry.start
|
data/bin/setup
ADDED
data/exe/arisaid
ADDED
data/lib/arisaid.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'breacan'
|
2
|
+
require 'yaml'
|
3
|
+
require 'thor'
|
4
|
+
require 'colorize'
|
5
|
+
|
6
|
+
require 'arisaid/version'
|
7
|
+
require 'arisaid/core_ext/hash'
|
8
|
+
require 'arisaid/core_ext/array'
|
9
|
+
require 'arisaid/error'
|
10
|
+
require 'arisaid/configurable'
|
11
|
+
require 'arisaid/client'
|
12
|
+
require 'arisaid/userable'
|
13
|
+
require 'arisaid/syncable'
|
14
|
+
require 'arisaid/usergroups'
|
15
|
+
require 'arisaid/users'
|
16
|
+
require 'arisaid/guests'
|
17
|
+
require 'arisaid/bots'
|
18
|
+
require 'arisaid/cli'
|
19
|
+
|
20
|
+
module Arisaid
|
21
|
+
class << self
|
22
|
+
include Arisaid::Configurable
|
23
|
+
|
24
|
+
def usergroups(team = '')
|
25
|
+
@usergroups ||= Usergroups.new(team)
|
26
|
+
end
|
27
|
+
|
28
|
+
def users(team = '')
|
29
|
+
@users ||= Users.new(team)
|
30
|
+
end
|
31
|
+
|
32
|
+
def guests(team = '')
|
33
|
+
@guests ||= Guests.new(team)
|
34
|
+
end
|
35
|
+
|
36
|
+
def bots(team = '')
|
37
|
+
@bots ||= Bots.new(team)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/arisaid/bots.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Arisaid
|
2
|
+
class Bots
|
3
|
+
include Arisaid::Client
|
4
|
+
include Arisaid::Userable
|
5
|
+
include Arisaid::Syncable
|
6
|
+
|
7
|
+
def remote!
|
8
|
+
@remote = bots!.map { |user|
|
9
|
+
hash = user.to_h.slice(*self.class.bot_valid_attributes)
|
10
|
+
hash[:real] = user.real_name if user.real_name && !user.real_name.empty?
|
11
|
+
hash.stringify_keys
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def bot_valid_attributes
|
17
|
+
%i(
|
18
|
+
name
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/arisaid/cli.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'arisaid'
|
2
|
+
require 'thor'
|
3
|
+
|
4
|
+
module Arisaid
|
5
|
+
class CLI < Thor
|
6
|
+
RESOURCES = %w(
|
7
|
+
users
|
8
|
+
usergroups
|
9
|
+
)
|
10
|
+
|
11
|
+
option :team, type: :string, aliases: '-t', desc: 'slack team'
|
12
|
+
option :token, type: :string, aliases: '-p', desc: 'slack token'
|
13
|
+
option :debug, type: :boolean, aliases: '-d', desc: 'debug'
|
14
|
+
desc 'show [RESOURCE]', "show #{RESOURCES.join(', ')}"
|
15
|
+
def show(resource)
|
16
|
+
Arisaid.debug = true if options[:debug]
|
17
|
+
Arisaid.send(:"#{resource}", options[:team]).show
|
18
|
+
end
|
19
|
+
|
20
|
+
option :team, type: :string, aliases: '-t', desc: 'slack team'
|
21
|
+
option :token, type: :string, aliases: '-p', desc: 'slack token'
|
22
|
+
option :debug, type: :boolean, aliases: '-d', desc: 'debug'
|
23
|
+
desc 'save [RESOURCE]', "save #{RESOURCES.join(', ')}"
|
24
|
+
def save(resource)
|
25
|
+
Arisaid.debug = true if options[:debug]
|
26
|
+
Arisaid.send(:"#{resource}", options[:team]).save
|
27
|
+
end
|
28
|
+
|
29
|
+
option :team, type: :string, aliases: '-t', desc: 'slack team'
|
30
|
+
option :token, type: :string, aliases: '-p', desc: 'slack token'
|
31
|
+
option :debug, type: :boolean, aliases: '-d', desc: 'debug'
|
32
|
+
option :dryrun, type: :boolean, aliases: '-n', desc: 'dry run'
|
33
|
+
desc 'apply [RESOURCE]', "apply #{RESOURCES.join(', ')}"
|
34
|
+
def apply(resource)
|
35
|
+
Arisaid.read_only = true if options[:dryrun]
|
36
|
+
Arisaid.debug = true if options[:debug]
|
37
|
+
Arisaid.send(:"#{resource}", options[:team]).apply
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'arisaid/faraday/request'
|
2
|
+
require 'arisaid/faraday/response'
|
3
|
+
|
4
|
+
module Arisaid
|
5
|
+
module Client
|
6
|
+
def client
|
7
|
+
@client ||= client!
|
8
|
+
end
|
9
|
+
|
10
|
+
def client!
|
11
|
+
Arisaid.slack_team
|
12
|
+
Arisaid.slack_token
|
13
|
+
|
14
|
+
Breacan.setup
|
15
|
+
Breacan.configure do |config|
|
16
|
+
config.middleware = ::Faraday::RackBuilder.new do |c|
|
17
|
+
c.request :arisaid
|
18
|
+
c.response :arisaid
|
19
|
+
c.response :breacan_custom
|
20
|
+
c.adapter ::Faraday.default_adapter
|
21
|
+
end
|
22
|
+
end
|
23
|
+
Breacan
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'pit'
|
2
|
+
require 'io/console'
|
3
|
+
|
4
|
+
module Arisaid
|
5
|
+
module Configurable
|
6
|
+
OPTIONS_KEYS = %i(
|
7
|
+
debug
|
8
|
+
read_only
|
9
|
+
slack_team
|
10
|
+
slack_token
|
11
|
+
save_token
|
12
|
+
conf_prefix
|
13
|
+
)
|
14
|
+
|
15
|
+
attr_accessor(*OPTIONS_KEYS)
|
16
|
+
|
17
|
+
def self.extended(base)
|
18
|
+
base.reset
|
19
|
+
end
|
20
|
+
|
21
|
+
def reset
|
22
|
+
self.debug = false
|
23
|
+
self.read_only = true
|
24
|
+
self.save_token = false
|
25
|
+
self.conf_prefix = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def options
|
29
|
+
OPTIONS_KEYS.inject({}) { |o, k| o.merge!(k => send(k)) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def configure
|
33
|
+
yield self
|
34
|
+
end
|
35
|
+
|
36
|
+
def debug?
|
37
|
+
@debug
|
38
|
+
end
|
39
|
+
|
40
|
+
def read_only?
|
41
|
+
@read_only
|
42
|
+
end
|
43
|
+
|
44
|
+
def save_token?
|
45
|
+
@save_token
|
46
|
+
end
|
47
|
+
|
48
|
+
def slack_team
|
49
|
+
ENV['BREACAN_TEAM'] ||= ask_slack_team
|
50
|
+
end
|
51
|
+
|
52
|
+
def slack_team=(team)
|
53
|
+
ENV['BREACAN_TEAM'] = team
|
54
|
+
end
|
55
|
+
|
56
|
+
def ask_slack_team
|
57
|
+
$stdout.print 'Slack Team: '
|
58
|
+
$stdin.gets.gsub(/\n/, '')
|
59
|
+
end
|
60
|
+
|
61
|
+
def slack_token
|
62
|
+
ENV['BREACAN_ACCESS_TOKEN'] ||= slack_token!
|
63
|
+
end
|
64
|
+
|
65
|
+
def slack_token!
|
66
|
+
token = slack_token_by_pit
|
67
|
+
|
68
|
+
if token.nil?
|
69
|
+
token = ask_slack_token
|
70
|
+
save_slack_token_by_pit(token) if save_token?
|
71
|
+
end
|
72
|
+
|
73
|
+
token
|
74
|
+
end
|
75
|
+
|
76
|
+
def ask_slack_token
|
77
|
+
$stdout.print 'Slack Token(https://api.slack.com/web): '
|
78
|
+
$stdin.noecho(&:gets).tap{ $stdout.print "\n" }.gsub(/\n/, '')
|
79
|
+
end
|
80
|
+
|
81
|
+
def save_slack_token_by_pit(token)
|
82
|
+
self.pit= if pit.is_a?(Hash)
|
83
|
+
pit.merge(slack_team => token)
|
84
|
+
else
|
85
|
+
{ slack_team => token }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def pit
|
90
|
+
Pit.get('arisaid')
|
91
|
+
end
|
92
|
+
|
93
|
+
def pit=(data)
|
94
|
+
Pit.set('arisaid', data: data)
|
95
|
+
end
|
96
|
+
|
97
|
+
def slack_token_by_pit
|
98
|
+
pit[slack_team]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
module Arisaid
|
4
|
+
module Faraday
|
5
|
+
class Request < ::Faraday::Middleware
|
6
|
+
def response_status
|
7
|
+
200
|
8
|
+
end
|
9
|
+
|
10
|
+
def response_body
|
11
|
+
Sawyer::Resource.new(Sawyer::Agent.new(Breacan.api_endpoint))
|
12
|
+
end
|
13
|
+
|
14
|
+
def response_object
|
15
|
+
Struct.new(
|
16
|
+
:env, :method, :status, :path, :params, :headers, :body, :options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def show_request(env)
|
20
|
+
unescaped_url = URI.unescape(env.url.to_s)
|
21
|
+
puts "#{env.method}: #{Breacan::Error.new.send(:redact_url, unescaped_url)}#{' dryrun'.colorize(:yellow) unless requestable?(env)}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def stub_out(env)
|
25
|
+
response_object.new(
|
26
|
+
env, env.method, response_status, env.url, nil, {}, response_body)
|
27
|
+
end
|
28
|
+
|
29
|
+
def read?(env)
|
30
|
+
unread_pattern = /\.(create|disable|enable|update|setActive|setPresence)\?/
|
31
|
+
return env.method == :get && unread_pattern !~ env.url.to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
def requestable?(env)
|
35
|
+
!Arisaid.read_only? || read?(env)
|
36
|
+
end
|
37
|
+
|
38
|
+
def call(env)
|
39
|
+
show_request(env) if Arisaid.read_only? || Arisaid.debug?
|
40
|
+
|
41
|
+
if requestable?(env)
|
42
|
+
@app.call(env)
|
43
|
+
else
|
44
|
+
stub_out(env)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
::Faraday::Request.register_middleware arisaid: -> { ::Arisaid::Faraday::Request }
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Arisaid
|
2
|
+
module Faraday
|
3
|
+
class Response < ::Faraday::Middleware
|
4
|
+
def call(env)
|
5
|
+
@app.call(env).on_complete do |_env|
|
6
|
+
show_response(_env) if Arisaid.debug? && defined?(AwesomePrint)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def show_response(env)
|
11
|
+
require 'awesome_print'
|
12
|
+
|
13
|
+
env.response.to_hash.slice(*valid_debug_attributes).each do |k, v|
|
14
|
+
if k == :body
|
15
|
+
k = :response_body
|
16
|
+
v = Sawyer::Agent.serializer.decode(v)
|
17
|
+
end
|
18
|
+
|
19
|
+
puts "#{k}:"
|
20
|
+
ap v
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def valid_debug_attributes
|
25
|
+
%i(
|
26
|
+
status
|
27
|
+
body
|
28
|
+
response_headers
|
29
|
+
)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
::Faraday::Response.register_middleware arisaid: -> { ::Arisaid::Faraday::Response }
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Arisaid
|
2
|
+
class Guests
|
3
|
+
include Arisaid::Client
|
4
|
+
include Arisaid::Userable
|
5
|
+
include Arisaid::Syncable
|
6
|
+
|
7
|
+
def remote!
|
8
|
+
@remote = guests!.map { |user|
|
9
|
+
hash = user.to_h.slice(*self.class.user_valid_attributes)
|
10
|
+
hash[:real] = user.real_name if user.real_name && !user.real_name.empty?
|
11
|
+
hash[:email] = user.profile.email if user.profile.email
|
12
|
+
hash.stringify_keys
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def user_valid_attributes
|
18
|
+
%i(
|
19
|
+
name
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Arisaid
|
2
|
+
module Syncable
|
3
|
+
attr_writer :local_file
|
4
|
+
|
5
|
+
def local_file
|
6
|
+
name = self.class.name.split('::').last.downcase
|
7
|
+
@local_file ||=
|
8
|
+
"#{Arisaid.conf_prefix if Arisaid.conf_prefix}#{name}.yml"
|
9
|
+
end
|
10
|
+
|
11
|
+
def local_file_path
|
12
|
+
File.join(Dir.pwd, local_file)
|
13
|
+
end
|
14
|
+
|
15
|
+
def remote
|
16
|
+
@remote || remote!
|
17
|
+
end
|
18
|
+
|
19
|
+
def remote!
|
20
|
+
end
|
21
|
+
|
22
|
+
def local
|
23
|
+
merge_users(local_by_stdin || local_by_file)
|
24
|
+
end
|
25
|
+
|
26
|
+
def local_by_stdin
|
27
|
+
if File.pipe?(STDIN) || File.select([STDIN], [], [], 0) != nil
|
28
|
+
buffer = ''
|
29
|
+
while str = STDIN.gets
|
30
|
+
buffer << str
|
31
|
+
end
|
32
|
+
YAML.load(buffer.chomp)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def local_by_file
|
37
|
+
unless File.exists?(local_file_path)
|
38
|
+
raise Arisaid::ConfNotFound.new("Not found: #{local_file_path}")
|
39
|
+
end
|
40
|
+
YAML.load_file(local_file_path)
|
41
|
+
end
|
42
|
+
|
43
|
+
def merge_users(config)
|
44
|
+
config.map do |c|
|
45
|
+
c["users"] = c["users"].flatten.uniq
|
46
|
+
c
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def initialize(team = nil)
|
51
|
+
Arisaid.slack_team = team if team
|
52
|
+
end
|
53
|
+
|
54
|
+
def show
|
55
|
+
puts remote.to_yaml
|
56
|
+
end
|
57
|
+
|
58
|
+
def apply
|
59
|
+
end
|
60
|
+
|
61
|
+
def same?(src, dst)
|
62
|
+
src == dst
|
63
|
+
end
|
64
|
+
|
65
|
+
def save
|
66
|
+
File.write local_file_path, remote.to_yaml
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Arisaid
|
2
|
+
module Userable
|
3
|
+
attr_reader :users, :guests, :bots
|
4
|
+
|
5
|
+
def users
|
6
|
+
@users || users!
|
7
|
+
end
|
8
|
+
|
9
|
+
def users!
|
10
|
+
@users = client.users.select { |u|
|
11
|
+
u.deleted == false && u.is_bot == false && u.is_restricted == false
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def guests
|
16
|
+
@guests || guests!
|
17
|
+
end
|
18
|
+
|
19
|
+
def guests!
|
20
|
+
@guests = client.users.select { |u|
|
21
|
+
u.deleted == false && u.is_bot == false && u.is_restricted == true
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def bots
|
26
|
+
@bots || bots!
|
27
|
+
end
|
28
|
+
|
29
|
+
def bots!
|
30
|
+
@bots = client.users.select { |u|
|
31
|
+
u.deleted == false && u.is_bot == true && u.is_restricted == false
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module Arisaid
|
2
|
+
class Usergroups
|
3
|
+
include Arisaid::Client
|
4
|
+
include Arisaid::Userable
|
5
|
+
include Arisaid::Syncable
|
6
|
+
|
7
|
+
def usergroups
|
8
|
+
@usergroups || usergroups!
|
9
|
+
end
|
10
|
+
|
11
|
+
def usergroups!
|
12
|
+
@usergroups = usergroups_with_disabled!.select { |g| g.deleted_by.nil? }
|
13
|
+
end
|
14
|
+
|
15
|
+
def usergroups_with_disabled
|
16
|
+
@usergroups_with_disabled || usergroups_with_disabled!
|
17
|
+
end
|
18
|
+
|
19
|
+
def usergroups_with_disabled!
|
20
|
+
@usergroups_with_disabled =
|
21
|
+
client.usergroups(include_users: 1, include_disabled: 1)
|
22
|
+
end
|
23
|
+
|
24
|
+
def remote!
|
25
|
+
@remote = usergroups!.map { |group|
|
26
|
+
hash = group.to_h.slice(*self.class.usergroup_valid_attributes)
|
27
|
+
hash[:users] = group.users ? group.users.map { |id| users.find_by(id: id).name } : {}
|
28
|
+
hash.stringify_keys
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def apply
|
33
|
+
enabled = false
|
34
|
+
|
35
|
+
local.each do |src|
|
36
|
+
dst = remote.find_by(name: src['name'])
|
37
|
+
next unless dst.nil?
|
38
|
+
|
39
|
+
group = usergroups_with_disabled.find_by(name: src['name'])
|
40
|
+
if group
|
41
|
+
enable group
|
42
|
+
enabled = true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
remote! if enabled
|
47
|
+
|
48
|
+
local.each do |src|
|
49
|
+
dst = remote.find_by(name: src['name'])
|
50
|
+
case
|
51
|
+
when dst.nil? then create src
|
52
|
+
when same?(src, dst) then nil
|
53
|
+
when changed?(src, dst) then update(src)
|
54
|
+
else
|
55
|
+
usergroup = usergroups.find_by(name: src['name'])
|
56
|
+
update_users(usergroup.id, src)
|
57
|
+
end
|
58
|
+
end if !(enabled && Arisaid.read_only?)
|
59
|
+
|
60
|
+
remote.each do |dst|
|
61
|
+
src = local.find_by(name: dst['name'])
|
62
|
+
disable dst if src.nil?
|
63
|
+
end
|
64
|
+
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def changed?(src, dst)
|
69
|
+
!same?(src, dst) && src['users'] == dst['users']
|
70
|
+
end
|
71
|
+
|
72
|
+
def create(src)
|
73
|
+
group = client.create_usergroup(
|
74
|
+
src.slice(*self.class.usergroup_valid_attributes.map(&:to_s)))
|
75
|
+
update_users(group.id, src) if group.respond_to?(:id)
|
76
|
+
end
|
77
|
+
|
78
|
+
def enable(group)
|
79
|
+
client.enable_usergroup(usergroup: group.id)
|
80
|
+
end
|
81
|
+
|
82
|
+
def disable(dst)
|
83
|
+
group = usergroups.find_by(name: dst['name'])
|
84
|
+
client.disable_usergroup(usergroup: group.id)
|
85
|
+
end
|
86
|
+
|
87
|
+
def update(src)
|
88
|
+
group = usergroups.find_by(name: src['name'])
|
89
|
+
data = src.dup
|
90
|
+
data['usergroup'] = group.id
|
91
|
+
data.delete('users') unless data['users'].nil?
|
92
|
+
client.update_usergroup(data)
|
93
|
+
end
|
94
|
+
|
95
|
+
def update_users(group_id, src)
|
96
|
+
data = {
|
97
|
+
usergroup: group_id,
|
98
|
+
users: usernames_to_ids(src['users']).join(',')
|
99
|
+
}
|
100
|
+
client.update_usergroup_users(data)
|
101
|
+
end
|
102
|
+
|
103
|
+
def usernames_to_ids(usernames)
|
104
|
+
usernames.each.with_object([]) do |username, memo|
|
105
|
+
user = users.find_by(name: username)
|
106
|
+
if user
|
107
|
+
memo << user.id
|
108
|
+
else
|
109
|
+
puts "#{'user not found:'.colorize(:red)} #{username}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
class << self
|
115
|
+
def usergroup_valid_attributes
|
116
|
+
%i(
|
117
|
+
name
|
118
|
+
description
|
119
|
+
handle
|
120
|
+
)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Arisaid
|
2
|
+
class Users
|
3
|
+
include Arisaid::Client
|
4
|
+
include Arisaid::Userable
|
5
|
+
include Arisaid::Syncable
|
6
|
+
|
7
|
+
def remote!
|
8
|
+
@remote = users!.map { |user|
|
9
|
+
hash = user.to_h.slice(*self.class.user_valid_attributes)
|
10
|
+
hash[:real] = user.real_name if user.real_name && !user.real_name.empty?
|
11
|
+
hash[:email] = user.profile.email if user.profile.email
|
12
|
+
hash.stringify_keys
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def user_valid_attributes
|
18
|
+
%i(
|
19
|
+
name
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: arisaid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- linyows
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-02-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: breacan
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.6'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: colorize
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.10'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.10'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: minitest
|
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
|
+
description: Configure the slack by yaml files.
|
112
|
+
email:
|
113
|
+
- linyows@gmail.com
|
114
|
+
executables:
|
115
|
+
- arisaid
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- ".gitignore"
|
120
|
+
- Gemfile
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- arisaid.gemspec
|
124
|
+
- bin/console
|
125
|
+
- bin/setup
|
126
|
+
- exe/arisaid
|
127
|
+
- lib/arisaid.rb
|
128
|
+
- lib/arisaid/bots.rb
|
129
|
+
- lib/arisaid/cli.rb
|
130
|
+
- lib/arisaid/client.rb
|
131
|
+
- lib/arisaid/configurable.rb
|
132
|
+
- lib/arisaid/core_ext/array.rb
|
133
|
+
- lib/arisaid/core_ext/hash.rb
|
134
|
+
- lib/arisaid/error.rb
|
135
|
+
- lib/arisaid/faraday/request.rb
|
136
|
+
- lib/arisaid/faraday/response.rb
|
137
|
+
- lib/arisaid/guests.rb
|
138
|
+
- lib/arisaid/syncable.rb
|
139
|
+
- lib/arisaid/userable.rb
|
140
|
+
- lib/arisaid/usergroups.rb
|
141
|
+
- lib/arisaid/users.rb
|
142
|
+
- lib/arisaid/version.rb
|
143
|
+
homepage: https://github.com/pepabo/arisaid
|
144
|
+
licenses:
|
145
|
+
- MIT
|
146
|
+
metadata: {}
|
147
|
+
post_install_message:
|
148
|
+
rdoc_options: []
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - ">="
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '0'
|
156
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
requirements: []
|
162
|
+
rubyforge_project:
|
163
|
+
rubygems_version: 2.5.1
|
164
|
+
signing_key:
|
165
|
+
specification_version: 4
|
166
|
+
summary: Slack configuration.
|
167
|
+
test_files: []
|