sem 0.2.3 → 0.2.4
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 +4 -4
- data/.rubocop.yml +1 -1
- data/lib/sem/api/base.rb +11 -13
- data/lib/sem/api/env_var.rb +7 -0
- data/lib/sem/api/file.rb +7 -0
- data/lib/sem/api/org.rb +28 -0
- data/lib/sem/api/project.rb +50 -0
- data/lib/sem/api/shared_config.rb +109 -0
- data/lib/sem/api/team.rb +90 -0
- data/lib/sem/api/user.rb +8 -0
- data/lib/sem/api.rb +7 -8
- data/lib/sem/cli/orgs.rb +12 -12
- data/lib/sem/cli/projects.rb +30 -32
- data/lib/sem/cli/shared_configs.rb +71 -67
- data/lib/sem/cli/teams.rb +84 -106
- data/lib/sem/version.rb +1 -1
- data/lib/sem/views/env_vars.rb +2 -2
- data/lib/sem/views/files.rb +2 -2
- data/lib/sem/views/orgs.rb +12 -14
- data/lib/sem/views/projects.rb +28 -29
- data/lib/sem/views/shared_configs.rb +32 -20
- data/lib/sem/views/teams.rb +47 -65
- data/lib/sem/views/users.rb +6 -6
- data/lib/sem.rb +5 -0
- data/sem.gemspec +4 -0
- metadata +59 -36
- data/lib/sem/api/env_vars.rb +0 -22
- data/lib/sem/api/files.rb +0 -21
- data/lib/sem/api/orgs.rb +0 -42
- data/lib/sem/api/projects.rb +0 -42
- data/lib/sem/api/shared_configs.rb +0 -103
- data/lib/sem/api/teams.rb +0 -69
- data/lib/sem/api/traits/associated_with_org.rb +0 -17
- data/lib/sem/api/traits/associated_with_project.rb +0 -29
- data/lib/sem/api/traits/associated_with_shared_config.rb +0 -31
- data/lib/sem/api/traits/associated_with_team.rb +0 -29
- data/lib/sem/api/traits.rb +0 -10
- data/lib/sem/api/users.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c386662fdc6f698a75d2a465bf2341995130638
|
4
|
+
data.tar.gz: 8042f7c3359a3ff026658784aed2950fd6b36d7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c29dda2661f328865b4671e5da73d5bfb50a5d68619f9201a72c14aad2fd07f2382c7ddb65ce4a96616e70d0952789055d7e95db1ba5a8547307d69afdfb1c7
|
7
|
+
data.tar.gz: 61246d6688a5618bdafb366d56855ad8553c05f8b037ad652b00d698a81db2e53dfc47e5269ef5cdd925509c390fa4a0a197bf6cb0145edbf048c89b39417159
|
data/.rubocop.yml
CHANGED
data/lib/sem/api/base.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
|
-
module Sem
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
1
|
+
module Sem::API::Base
|
2
|
+
module_function
|
3
|
+
|
4
|
+
def client
|
5
|
+
@client ||= SemaphoreClient.new(
|
6
|
+
Sem::Configuration.auth_token,
|
7
|
+
:api_url => Sem::Configuration.api_url,
|
8
|
+
:verbose => (Sem.log_level == Sem::LOG_LEVEL_TRACE),
|
9
|
+
:auto_paginate => true
|
10
|
+
)
|
14
11
|
end
|
12
|
+
|
15
13
|
end
|
data/lib/sem/api/file.rb
ADDED
data/lib/sem/api/org.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
class Sem::API::Org < SimpleDelegator
|
2
|
+
extend Sem::API::Base
|
3
|
+
|
4
|
+
def self.all
|
5
|
+
client.orgs.list.map { |org| new(org) }
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.find!(org_name)
|
9
|
+
org = client.orgs.get(org_name)
|
10
|
+
|
11
|
+
raise Sem::Errors::ResourceNotFound.new("Organization", [org_name]) if org.nil?
|
12
|
+
|
13
|
+
new(org)
|
14
|
+
end
|
15
|
+
|
16
|
+
def users
|
17
|
+
Sem::API::Base.client.users.list_for_org(name).map { |user| Sem::API::User.new(user) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def teams
|
21
|
+
Sem::API::Base.client.teams.list_for_org(name).map { |team| Sem::API::Team.new(team) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def projects
|
25
|
+
Sem::API::Base.client.projects.list_for_org(name).map { |project| Sem::API::Project.new(project) }
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Sem::API::Project < SimpleDelegator
|
2
|
+
extend Sem::API::Base
|
3
|
+
|
4
|
+
def self.all
|
5
|
+
Sem::API::Org.all.map do |org|
|
6
|
+
client.projects.list_for_org(org.username).map { |project| new(org.username, project) }
|
7
|
+
end.flatten
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.find!(project_srn)
|
11
|
+
org_name, project_name = Sem::SRN.parse_project(project_srn)
|
12
|
+
|
13
|
+
# TODO: fix .to_a bug in client
|
14
|
+
|
15
|
+
project = client.projects.list_for_org(org_name, :name => project_name).to_a.first
|
16
|
+
|
17
|
+
raise Sem::Errors::ResourceNotFound.new("Project", [org_name, project_name]) if project.nil?
|
18
|
+
|
19
|
+
new(org_name, project)
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_reader :org_name
|
23
|
+
|
24
|
+
def initialize(org_name, project)
|
25
|
+
@org_name = org_name
|
26
|
+
|
27
|
+
super(project)
|
28
|
+
end
|
29
|
+
|
30
|
+
def full_name
|
31
|
+
"#{@org_name}/#{name}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def teams
|
35
|
+
client.teams.list_for_project(id).map { |team| Sem::API::Team.new(org_name, team) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def shared_configs
|
39
|
+
Sem::API::Base.client.shared_configs.list_for_project(id).map { |project| Sem::API::SharedConfig.new(org_name, project) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_shared_config(shared_config)
|
43
|
+
Sem::API::Base.client.shared_configs.attach_to_project(shared_config.id, id)
|
44
|
+
end
|
45
|
+
|
46
|
+
def remove_shared_config(shared_config)
|
47
|
+
Sem::API::Base.client.shared_configs.detach_from_project(shared_config.id, id)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
class Sem::API::SharedConfig < SimpleDelegator
|
2
|
+
extend Sem::API::Base
|
3
|
+
|
4
|
+
def self.all
|
5
|
+
Sem::API::Org.all.pmap do |org|
|
6
|
+
client.shared_configs.list_for_org(org.username).map { |config| new(org.username, config) }
|
7
|
+
end.flatten
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.find!(shared_config_srn)
|
11
|
+
org_name, shared_config_name = Sem::SRN.parse_shared_config(shared_config_srn)
|
12
|
+
|
13
|
+
configs = client.shared_configs.list_for_org(org_name)
|
14
|
+
config = configs.find { |c| c.name == shared_config_name }
|
15
|
+
|
16
|
+
if config.nil?
|
17
|
+
raise Sem::Errors::ResourceNotFound.new("Shared Configuration", [org_name, shared_config_name])
|
18
|
+
end
|
19
|
+
|
20
|
+
new(org_name, config)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.create!(shared_config_srn, args = {})
|
24
|
+
org_name, shared_config_name = Sem::SRN.parse_shared_config(shared_config_srn)
|
25
|
+
|
26
|
+
shared_config = client.shared_configs.create_for_org(org_name, args.merge(:name => shared_config_name))
|
27
|
+
|
28
|
+
if shared_config.nil?
|
29
|
+
raise Sem::Errors::ResourceNotCreated.new("Shared Configuration", [org_name, shared_config_name])
|
30
|
+
end
|
31
|
+
|
32
|
+
new(org_name, shared_config)
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :org_name
|
36
|
+
|
37
|
+
def initialize(org_name, shared_config)
|
38
|
+
@org_name = org_name
|
39
|
+
|
40
|
+
super(shared_config)
|
41
|
+
end
|
42
|
+
|
43
|
+
def full_name
|
44
|
+
"#{org_name}/#{name}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_config_file(args)
|
48
|
+
file = Sem::API::Base.client.config_files.create_for_shared_config(id, args)
|
49
|
+
|
50
|
+
if file.nil?
|
51
|
+
raise Sem::Errors::ResourceNotCreated.new("Configuration File", [org_name, path])
|
52
|
+
end
|
53
|
+
|
54
|
+
Sem::API::File.new(file)
|
55
|
+
end
|
56
|
+
|
57
|
+
def remove_config_file(path)
|
58
|
+
file = files.find { |f| f.path == path }
|
59
|
+
|
60
|
+
if file.nil?
|
61
|
+
raise Sem::Errors::ResourceNotCreated.new("Configuration File", [org_name, path])
|
62
|
+
end
|
63
|
+
|
64
|
+
Sem::API::Base.client.config_files.delete(file.id)
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_env_var(args)
|
68
|
+
env_var = Sem::API::Base.client.env_vars.create_for_shared_config(id, args)
|
69
|
+
|
70
|
+
if env_var.nil?
|
71
|
+
raise Sem::Errors::ResourceNotCreated.new("Environment Variable", [org_name, args[:name]])
|
72
|
+
end
|
73
|
+
|
74
|
+
Sem::API::EnvVar.new(env_var)
|
75
|
+
end
|
76
|
+
|
77
|
+
def remove_env_var(name)
|
78
|
+
env_var = env_vars.find { |var| var.name == name }
|
79
|
+
|
80
|
+
if env_var.nil?
|
81
|
+
raise Sem::Errors::ResourceNotCreated.new("Environment Variable", [org_name, name])
|
82
|
+
end
|
83
|
+
|
84
|
+
Sem::API::Base.client.env_vars.delete(env_var.id)
|
85
|
+
end
|
86
|
+
|
87
|
+
def update!(args)
|
88
|
+
shared_config = Sem::API::Base.client.shared_configs.update(id, args)
|
89
|
+
|
90
|
+
if shared_config.nil?
|
91
|
+
raise Sem::Errors::ResourceNotUpdated.new("Shared Configuration", [org_name, name])
|
92
|
+
end
|
93
|
+
|
94
|
+
self.class.new(org_name, shared_config)
|
95
|
+
end
|
96
|
+
|
97
|
+
def delete!
|
98
|
+
Sem::API::Base.client.shared_configs.delete(id)
|
99
|
+
end
|
100
|
+
|
101
|
+
def files
|
102
|
+
Sem::API::Base.client.config_files.list_for_shared_config(id).map { |file| Sem::API::File.new(file) }
|
103
|
+
end
|
104
|
+
|
105
|
+
def env_vars
|
106
|
+
Sem::API::Base.client.env_vars.list_for_shared_config(id).map { |env_var| Sem::API::EnvVar.new(env_var) }
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
data/lib/sem/api/team.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
class Sem::API::Team < SimpleDelegator
|
2
|
+
extend Sem::API::Base
|
3
|
+
|
4
|
+
def self.all
|
5
|
+
Sem::API::Org.all.pmap do |org|
|
6
|
+
client.teams.list_for_org(org.username).map { |team| new(org.username, team) }
|
7
|
+
end.flatten
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.find!(team_srn)
|
11
|
+
org_name, team_name = Sem::SRN.parse_team(team_srn)
|
12
|
+
|
13
|
+
team = client.teams.list_for_org(org_name).find { |t| t.name == team_name }
|
14
|
+
|
15
|
+
raise Sem::Errors::ResourceNotFound.new("Team", [org_name, team_name]) if team.nil?
|
16
|
+
|
17
|
+
new(org_name, team)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.create!(team_srn, args)
|
21
|
+
org_name, team_name = Sem::SRN.parse_team(team_srn)
|
22
|
+
|
23
|
+
team = client.teams.create_for_org(org_name, args.merge(:name => team_name))
|
24
|
+
|
25
|
+
raise Sem::Errors::ResourceNotCreated.new("Team", [org_name, team_name]) if team.nil?
|
26
|
+
|
27
|
+
new(org_name, team)
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :org_name
|
31
|
+
|
32
|
+
def initialize(org_name, team)
|
33
|
+
@org_name = org_name
|
34
|
+
|
35
|
+
super(team)
|
36
|
+
end
|
37
|
+
|
38
|
+
def full_name
|
39
|
+
"#{org_name}/#{name}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def update(args)
|
43
|
+
new_team = Sem::API::Base.client.teams.update(id, args)
|
44
|
+
|
45
|
+
raise Sem::Errors::ResourceNotUpdated.new("Team", [@org_name, name]) if new_team.nil?
|
46
|
+
|
47
|
+
self.class.new(@org_name, new_team)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_user(username)
|
51
|
+
Sem::API::Base.client.users.attach_to_team(username, id)
|
52
|
+
end
|
53
|
+
|
54
|
+
def remove_user(username)
|
55
|
+
Sem::API::Base.client.users.detach_from_team(username, id)
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_project(project)
|
59
|
+
Sem::API::Base.client.projects.attach_to_team(project.id, id)
|
60
|
+
end
|
61
|
+
|
62
|
+
def remove_project(project)
|
63
|
+
Sem::API::Base.client.projects.detach_from_team(project.id, id)
|
64
|
+
end
|
65
|
+
|
66
|
+
def add_shared_config(config)
|
67
|
+
Sem::API::Base.client.shared_configs.attach_to_team(config.id, id)
|
68
|
+
end
|
69
|
+
|
70
|
+
def remove_shared_config(config)
|
71
|
+
Sem::API::Base.client.shared_configs.detach_from_team(config.id, id)
|
72
|
+
end
|
73
|
+
|
74
|
+
def delete!
|
75
|
+
Sem::API::Base.client.teams.delete(id)
|
76
|
+
end
|
77
|
+
|
78
|
+
def users
|
79
|
+
Sem::API::Base.client.users.list_for_team(id).map { |user| Sem::API::User.new(user) }
|
80
|
+
end
|
81
|
+
|
82
|
+
def projects
|
83
|
+
Sem::API::Base.client.projects.list_for_team(id).map { |project| Sem::API::Project.new(org_name, project) }
|
84
|
+
end
|
85
|
+
|
86
|
+
def shared_configs
|
87
|
+
Sem::API::Base.client.shared_configs.list_for_team(id).map { |config| Sem::API::SharedConfig.new(org_name, config) }
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
data/lib/sem/api/user.rb
ADDED
data/lib/sem/api.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
module Sem
|
2
2
|
module API
|
3
|
-
require_relative "api/traits"
|
4
3
|
require_relative "api/base"
|
5
|
-
require_relative "api/
|
6
|
-
require_relative "api/
|
7
|
-
require_relative "api/
|
8
|
-
require_relative "api/
|
9
|
-
require_relative "api/
|
10
|
-
require_relative "api/
|
11
|
-
require_relative "api/
|
4
|
+
require_relative "api/org"
|
5
|
+
require_relative "api/user"
|
6
|
+
require_relative "api/project"
|
7
|
+
require_relative "api/env_var"
|
8
|
+
require_relative "api/file"
|
9
|
+
require_relative "api/shared_config"
|
10
|
+
require_relative "api/team"
|
12
11
|
end
|
13
12
|
end
|
data/lib/sem/cli/orgs.rb
CHANGED
@@ -2,27 +2,27 @@ class Sem::CLI::Orgs < Dracula
|
|
2
2
|
|
3
3
|
desc "list", "list organizations"
|
4
4
|
def list
|
5
|
-
orgs = Sem::API::
|
5
|
+
orgs = Sem::API::Org.all
|
6
6
|
|
7
|
-
|
7
|
+
if !orgs.empty?
|
8
|
+
Sem::Views::Orgs.list(orgs)
|
9
|
+
else
|
10
|
+
Sem::Views::Orgs.create_first_org
|
11
|
+
end
|
8
12
|
end
|
9
13
|
|
10
14
|
desc "info", "shows detailed information about an organization"
|
11
|
-
def info(
|
12
|
-
|
15
|
+
def info(org_name)
|
16
|
+
org = Sem::API::Org.find!(org_name)
|
13
17
|
|
14
|
-
|
15
|
-
|
16
|
-
Sem::Views::Orgs.info(org_instance)
|
18
|
+
Sem::Views::Orgs.info(org)
|
17
19
|
end
|
18
20
|
|
19
21
|
desc "members", "list members of an organization"
|
20
|
-
def members(
|
21
|
-
|
22
|
-
|
23
|
-
users = Sem::API::Users.list_for_org(org_name)
|
22
|
+
def members(org_name)
|
23
|
+
org = Sem::API::Org.find!(org_name)
|
24
24
|
|
25
|
-
Sem::Views::Users.list(users)
|
25
|
+
Sem::Views::Users.list(org.users)
|
26
26
|
end
|
27
27
|
|
28
28
|
end
|
data/lib/sem/cli/projects.rb
CHANGED
@@ -2,59 +2,57 @@ class Sem::CLI::Projects < Dracula
|
|
2
2
|
|
3
3
|
desc "list", "list projects"
|
4
4
|
def list
|
5
|
-
projects = Sem::API::
|
5
|
+
projects = Sem::API::Project.all
|
6
6
|
|
7
|
-
|
7
|
+
if !projects.empty?
|
8
|
+
Sem::Views::Projects.list(projects)
|
9
|
+
else
|
10
|
+
Sem::Views::Projects.setup_first_project
|
11
|
+
end
|
8
12
|
end
|
9
13
|
|
10
14
|
desc "info", "shows detailed information about a project"
|
11
|
-
def info(
|
12
|
-
|
13
|
-
|
14
|
-
project_instance = Sem::API::Projects.info(org_name, project_name).to_h
|
15
|
+
def info(project_name)
|
16
|
+
project = Sem::API::Project.find!(project_name)
|
15
17
|
|
16
|
-
Sem::Views::Projects.info(
|
18
|
+
Sem::Views::Projects.info(project)
|
17
19
|
end
|
18
20
|
|
19
21
|
class SharedConfigs < Dracula
|
20
|
-
desc "list", "list shared configurations on a project"
|
21
|
-
def list(project)
|
22
|
-
org_name, project_name = Sem::SRN.parse_project(project)
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
Sem::
|
23
|
+
desc "list", "list shared configurations on a project"
|
24
|
+
def list(project_name)
|
25
|
+
project = Sem::API::Project.find!(project_name)
|
26
|
+
shared_configs = project.shared_configs
|
27
|
+
|
28
|
+
if !shared_configs.empty?
|
29
|
+
Sem::Views::SharedConfigs.list(shared_configs)
|
30
|
+
else
|
31
|
+
Sem::Views::Projects.attach_first_shared_config(project)
|
32
|
+
end
|
27
33
|
end
|
28
34
|
|
29
35
|
desc "add", "attach a shared configuration to a project"
|
30
|
-
def add(
|
31
|
-
|
32
|
-
|
36
|
+
def add(project_name, shared_config_name)
|
37
|
+
project = Sem::API::Project.find!(project_name)
|
38
|
+
shared_config = Sem::API::SharedConfig.find!(shared_config_name)
|
33
39
|
|
34
|
-
|
35
|
-
abort Sem::Views::Projects.org_names_not_matching("project", "shared configuration", project, shared_config)
|
36
|
-
end
|
37
|
-
|
38
|
-
Sem::API::SharedConfigs.add_to_project(project_org_name, project_name, shared_config_name)
|
40
|
+
project.add_shared_config(shared_config)
|
39
41
|
|
40
|
-
puts "Shared Configuration #{
|
42
|
+
puts "Shared Configuration #{shared_config_name} added to the project."
|
41
43
|
end
|
42
44
|
|
43
45
|
desc "remove", "removes a shared configuration from the project"
|
44
|
-
def remove(
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
if project_org_name != shared_config_org_name
|
49
|
-
abort Sem::Views::Projects.org_names_not_matching("project", "shared configuration", project, shared_config)
|
50
|
-
end
|
46
|
+
def remove(project_name, shared_config_name)
|
47
|
+
project = Sem::API::Project.find!(project_name)
|
48
|
+
shared_config = Sem::API::SharedConfig.find!(shared_config_name)
|
51
49
|
|
52
|
-
|
50
|
+
project.remove_shared_config(shared_config)
|
53
51
|
|
54
|
-
puts "Shared Configuration #{
|
52
|
+
puts "Shared Configuration #{shared_config_name} removed from the project."
|
55
53
|
end
|
54
|
+
|
56
55
|
end
|
57
56
|
|
58
57
|
register "shared-configs", "manage shared configurations", SharedConfigs
|
59
|
-
|
60
58
|
end
|