gooddata 0.6.7 → 0.6.8
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/CHANGELOG.md +19 -1
- data/README.md +10 -2
- data/TODO.md +32 -0
- data/gooddata.gemspec +5 -0
- data/lib/gooddata.rb +4 -0
- data/lib/gooddata/app/app.rb +12 -0
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +4 -3
- data/lib/gooddata/bricks/middleware/restforce_middleware.rb +2 -1
- data/lib/gooddata/cli/commands/console_cmd.rb +23 -5
- data/lib/gooddata/cli/commands/domain_cmd.rb +9 -10
- data/lib/gooddata/cli/commands/process_cmd.rb +11 -9
- data/lib/gooddata/cli/commands/project_cmd.rb +25 -27
- data/lib/gooddata/cli/commands/projects_cmd.rb +2 -2
- data/lib/gooddata/cli/commands/run_ruby_cmd.rb +1 -1
- data/lib/gooddata/cli/commands/user_cmd.rb +2 -2
- data/lib/gooddata/cli/hooks.rb +4 -2
- data/lib/gooddata/cli/shared.rb +1 -1
- data/lib/gooddata/cli/terminal.rb +1 -1
- data/lib/gooddata/commands/api.rb +1 -1
- data/lib/gooddata/commands/auth.rb +4 -28
- data/lib/gooddata/commands/domain.rb +9 -4
- data/lib/gooddata/commands/process.rb +26 -23
- data/lib/gooddata/commands/project.rb +74 -50
- data/lib/gooddata/commands/projects.rb +3 -2
- data/lib/gooddata/commands/role.rb +9 -3
- data/lib/gooddata/commands/user.rb +6 -4
- data/lib/gooddata/connection.rb +11 -45
- data/lib/gooddata/core/logging.rb +0 -1
- data/lib/gooddata/core/project.rb +22 -22
- data/lib/gooddata/core/rest.rb +9 -8
- data/lib/gooddata/core/user.rb +0 -11
- data/lib/gooddata/exceptions/project_not_found.rb +1 -0
- data/lib/gooddata/extensions/enumerable.rb +10 -0
- data/lib/gooddata/extensions/hash.rb +25 -0
- data/lib/gooddata/goodzilla/goodzilla.rb +4 -4
- data/lib/gooddata/helper/class_helper.rb +1 -0
- data/lib/gooddata/helper/helpers.rb +8 -0
- data/lib/gooddata/helpers/auth_helpers.rb +41 -0
- data/lib/gooddata/mixins/author.rb +1 -1
- data/lib/gooddata/mixins/contributor.rb +1 -1
- data/lib/gooddata/mixins/data_property_reader.rb +2 -0
- data/lib/gooddata/mixins/data_property_writer.rb +2 -0
- data/lib/gooddata/mixins/inspector.rb +49 -0
- data/lib/gooddata/mixins/md_finders.rb +16 -8
- data/lib/gooddata/mixins/md_id_to_uri.rb +12 -4
- data/lib/gooddata/mixins/md_object_indexer.rb +15 -4
- data/lib/gooddata/mixins/md_object_query.rb +42 -20
- data/lib/gooddata/mixins/md_relations.rb +21 -12
- data/lib/gooddata/mixins/meta_getter.rb +2 -0
- data/lib/gooddata/mixins/meta_property_reader.rb +2 -0
- data/lib/gooddata/mixins/meta_property_writer.rb +2 -0
- data/lib/gooddata/mixins/rest_resource.rb +32 -10
- data/lib/gooddata/mixins/root_key_getter.rb +1 -1
- data/lib/gooddata/models/data_result.rb +3 -1
- data/lib/gooddata/models/domain.rb +31 -22
- data/lib/gooddata/models/empty_result.rb +22 -0
- data/lib/gooddata/models/invitation.rb +11 -9
- data/lib/gooddata/models/links.rb +5 -3
- data/lib/gooddata/models/membership.rb +23 -28
- data/lib/gooddata/models/metadata.rb +35 -35
- data/lib/gooddata/models/metadata/attribute.rb +10 -8
- data/lib/gooddata/models/metadata/dashboard.rb +1 -1
- data/lib/gooddata/models/metadata/fact.rb +3 -3
- data/lib/gooddata/models/metadata/label.rb +4 -4
- data/lib/gooddata/models/metadata/metric.rb +76 -38
- data/lib/gooddata/models/metadata/report.rb +52 -17
- data/lib/gooddata/models/metadata/report_definition.rb +178 -28
- data/lib/gooddata/models/model.rb +13 -6
- data/lib/gooddata/models/process.rb +93 -30
- data/lib/gooddata/models/profile.rb +18 -20
- data/lib/gooddata/models/project.rb +344 -127
- data/lib/gooddata/models/project_creator.rb +32 -22
- data/lib/gooddata/models/project_metadata.rb +26 -14
- data/lib/gooddata/models/project_role.rb +15 -17
- data/lib/gooddata/models/report_data_result.rb +4 -0
- data/lib/gooddata/models/schedule.rb +51 -20
- data/lib/gooddata/models/schema_blueprint.rb +9 -3
- data/lib/gooddata/rest/README.md +37 -0
- data/lib/gooddata/rest/client.rb +318 -0
- data/lib/gooddata/rest/connection.rb +235 -0
- data/lib/gooddata/rest/connections/connections.rb +8 -0
- data/lib/gooddata/rest/connections/dummy_connection.rb +52 -0
- data/lib/gooddata/rest/connections/rest_client_connection.rb +177 -0
- data/lib/gooddata/rest/object.rb +32 -0
- data/lib/gooddata/rest/object_factory.rb +67 -0
- data/lib/gooddata/rest/resource.rb +17 -0
- data/lib/gooddata/rest/rest.rb +20 -0
- data/lib/gooddata/version.rb +1 -1
- data/spec/data/cc/data/source/commits.csv +4 -0
- data/spec/data/cc/data/source/devs.csv +4 -0
- data/spec/data/cc/data/source/repos.csv +3 -0
- data/spec/data/cc/devel.prm +0 -0
- data/spec/data/cc/graph/graph.grf +11 -0
- data/spec/data/cc/workspace.prm +19 -0
- data/spec/data/hello_world_process/hello_world.rb +1 -0
- data/spec/data/hello_world_process/hello_world.zip +0 -0
- data/spec/data/users.csv +12 -12
- data/spec/helpers/connection_helper.rb +6 -0
- data/spec/helpers/process_helper.rb +12 -0
- data/spec/helpers/project_helper.rb +2 -2
- data/spec/integration/command_projects_spec.rb +11 -9
- data/spec/integration/create_from_template_spec.rb +6 -2
- data/spec/integration/full_process_schedule_spec.rb +49 -36
- data/spec/integration/full_project_spec.rb +221 -256
- data/spec/integration/partial_md_export_import_spec.rb +18 -17
- data/spec/logging_in_logging_out_spec.rb +17 -8
- data/spec/spec_helper.rb +4 -2
- data/spec/unit/cli/commands/cmd_api_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_auth_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_domain_spec.rb +29 -3
- data/spec/unit/cli/commands/cmd_process_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_project_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_role_spec.rb +13 -2
- data/spec/unit/cli/commands/cmd_run_ruby_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_scaffold_spec.rb +1 -1
- data/spec/unit/cli/commands/cmd_user_spec.rb +1 -1
- data/spec/unit/commands/command_api_spec.rb +0 -19
- data/spec/unit/commands/command_auth_spec.rb +20 -13
- data/spec/unit/commands/command_dataset_spec.rb +2 -2
- data/spec/unit/commands/command_process_spec.rb +24 -21
- data/spec/unit/commands/command_projects_spec.rb +2 -2
- data/spec/unit/commands/command_scaffold_spec.rb +2 -2
- data/spec/unit/commands/command_user_spec.rb +3 -3
- data/spec/unit/core/connection_spec.rb +9 -10
- data/spec/unit/core/project_spec.rb +8 -4
- data/spec/unit/core/rest_spec.rb +6 -6
- data/spec/unit/models/domain_spec.rb +14 -7
- data/spec/unit/models/invitation_spec.rb +2 -2
- data/spec/unit/models/membership_spec.rb +5 -5
- data/spec/unit/models/metric_spec.rb +92 -0
- data/spec/unit/models/profile_spec.rb +25 -21
- data/spec/unit/models/project_blueprint_spec.rb +6 -6
- data/spec/unit/models/project_role_spec.rb +3 -5
- data/spec/unit/models/project_spec.rb +43 -37
- data/spec/unit/models/schedule_spec.rb +58 -107
- data/spec/unit/rest/resource_spec.rb +6 -0
- metadata +87 -10
- data/lib/gooddata/cli/commands/role_cmd.rb +0 -28
- data/lib/gooddata/core/connection.rb +0 -392
- data/lib/gooddata/core/threaded.rb +0 -14
- data/lib/gooddata/models/md_object.rb +0 -25
- data/lib/gooddata/models/metadata/folder.rb +0 -24
- data/spec/unit/models/md_object_spec.rb +0 -55
- data/spec/unit/models/metric.rb +0 -92
|
@@ -12,8 +12,8 @@ GoodData::CLI.module_eval do
|
|
|
12
12
|
c.command :list do |list|
|
|
13
13
|
list.action do |global_options, options, args|
|
|
14
14
|
opts = options.merge(global_options)
|
|
15
|
-
GoodData.connect(opts)
|
|
16
|
-
list = GoodData::Command::Projects.list
|
|
15
|
+
client = GoodData.connect(opts)
|
|
16
|
+
list = GoodData::Command::Projects.list(client: client)
|
|
17
17
|
puts list.map { |p| [p.uri, p.title].join(',') }
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -9,7 +9,7 @@ require_relative '../../client'
|
|
|
9
9
|
|
|
10
10
|
GoodData::CLI.module_eval do
|
|
11
11
|
|
|
12
|
-
desc 'Run ruby bricks either locally or remotely deployed on our server'
|
|
12
|
+
desc 'Run ruby bricks either locally or remotely deployed on our server. Currently private alpha.'
|
|
13
13
|
# arg_name 'show'
|
|
14
14
|
command :run_ruby do |c|
|
|
15
15
|
|
|
@@ -13,8 +13,8 @@ GoodData::CLI.module_eval do
|
|
|
13
13
|
c.command :show do |show|
|
|
14
14
|
show.action do |global_options, options, args|
|
|
15
15
|
opts = options.merge(global_options)
|
|
16
|
-
GoodData.connect(opts)
|
|
17
|
-
pp GoodData::Command::User.show
|
|
16
|
+
client = GoodData.connect(opts)
|
|
17
|
+
pp GoodData::Command::User.show(client: client)
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
end
|
data/lib/gooddata/cli/hooks.rb
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
require 'gli'
|
|
4
4
|
require 'pp'
|
|
5
5
|
|
|
6
|
+
require_relative '../helpers/auth_helpers'
|
|
7
|
+
|
|
6
8
|
GoodData::CLI.module_eval do
|
|
7
9
|
pre do |global, command, options, args|
|
|
8
10
|
require 'logger'
|
|
@@ -11,7 +13,7 @@ GoodData::CLI.module_eval do
|
|
|
11
13
|
password = global[:password]
|
|
12
14
|
token = global[:token]
|
|
13
15
|
|
|
14
|
-
creds = GoodData::
|
|
16
|
+
creds = GoodData::Helpers::AuthHelper.read_credentials
|
|
15
17
|
|
|
16
18
|
username = creds[:username] if username.nil?
|
|
17
19
|
password = creds[:password] if password.nil?
|
|
@@ -39,7 +41,7 @@ GoodData::CLI.module_eval do
|
|
|
39
41
|
# return false to skip default error handling
|
|
40
42
|
# binding.pry
|
|
41
43
|
# pp exception.backtrace
|
|
42
|
-
pp exception
|
|
44
|
+
# pp exception
|
|
43
45
|
true
|
|
44
46
|
end
|
|
45
47
|
end
|
data/lib/gooddata/cli/shared.rb
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
|
|
3
3
|
require 'highline/import'
|
|
4
|
-
require 'multi_json'
|
|
5
4
|
|
|
6
5
|
require_relative '../cli/terminal'
|
|
7
6
|
require_relative '../helpers/helpers'
|
|
@@ -10,11 +9,6 @@ module GoodData
|
|
|
10
9
|
module Command
|
|
11
10
|
class Auth
|
|
12
11
|
class << self
|
|
13
|
-
# Get path of .gooddata config
|
|
14
|
-
def credentials_file
|
|
15
|
-
"#{GoodData::Helpers.home_directory}/.gooddata"
|
|
16
|
-
end
|
|
17
|
-
|
|
18
12
|
# Ask for credentials
|
|
19
13
|
def ask_for_credentials
|
|
20
14
|
puts 'Enter your GoodData credentials.'
|
|
@@ -25,26 +19,8 @@ module GoodData
|
|
|
25
19
|
{ :username => user, :password => password, :auth_token => auth_token }
|
|
26
20
|
end
|
|
27
21
|
|
|
28
|
-
# Read credentials
|
|
29
|
-
def read_credentials(credentials_file_path = credentials_file)
|
|
30
|
-
if File.exist?(credentials_file_path)
|
|
31
|
-
config = File.read(credentials_file_path)
|
|
32
|
-
MultiJson.load(config, :symbolize_keys => true)
|
|
33
|
-
else
|
|
34
|
-
{}
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Writes credentials
|
|
39
|
-
def write_credentials(credentials, credentials_file_path = credentials_file)
|
|
40
|
-
File.open(credentials_file_path, 'w', 0600) do |f|
|
|
41
|
-
f.puts MultiJson.encode(credentials, :pretty => true)
|
|
42
|
-
end
|
|
43
|
-
credentials
|
|
44
|
-
end
|
|
45
|
-
|
|
46
22
|
# Ask for credentials and store them
|
|
47
|
-
def store(credentials_file_path = credentials_file)
|
|
23
|
+
def store(credentials_file_path = Helpers::AuthHelper.credentials_file)
|
|
48
24
|
credentials = ask_for_credentials
|
|
49
25
|
|
|
50
26
|
ovewrite = if File.exist?(credentials_file_path)
|
|
@@ -54,15 +30,15 @@ module GoodData
|
|
|
54
30
|
end
|
|
55
31
|
|
|
56
32
|
if ovewrite == 'y'
|
|
57
|
-
write_credentials(credentials, credentials_file_path)
|
|
33
|
+
Helpers::AuthHelper.write_credentials(credentials, credentials_file_path)
|
|
58
34
|
else
|
|
59
35
|
puts 'Aborting...'
|
|
60
36
|
end
|
|
61
37
|
end
|
|
62
38
|
|
|
63
39
|
# Delete stored credentials
|
|
64
|
-
def unstore(credentials_file_path = credentials_file)
|
|
65
|
-
|
|
40
|
+
def unstore(credentials_file_path = Helpers::AuthHelper.credentials_file)
|
|
41
|
+
Helpers::AuthHelper.remove_credentials_file(credentials_file_path)
|
|
66
42
|
end
|
|
67
43
|
end
|
|
68
44
|
end
|
|
@@ -10,12 +10,17 @@ module GoodData
|
|
|
10
10
|
attr_reader :name
|
|
11
11
|
|
|
12
12
|
class << self
|
|
13
|
-
def add_user(domain, login, password)
|
|
14
|
-
|
|
13
|
+
def add_user(domain, login, password, opts = { :client => GoodData.connection })
|
|
14
|
+
data = {
|
|
15
|
+
:domain => domain,
|
|
16
|
+
:login => login,
|
|
17
|
+
:password => password
|
|
18
|
+
}
|
|
19
|
+
GoodData::Domain.add_user(data.merge(opts))
|
|
15
20
|
end
|
|
16
21
|
|
|
17
|
-
def list_users(domain)
|
|
18
|
-
GoodData::Domain.users(domain)
|
|
22
|
+
def list_users(domain, opts = { :client => GoodData.connection })
|
|
23
|
+
GoodData::Domain.users(domain, opts)
|
|
19
24
|
end
|
|
20
25
|
end
|
|
21
26
|
end
|
|
@@ -8,49 +8,52 @@ module GoodData
|
|
|
8
8
|
module Command
|
|
9
9
|
class Process
|
|
10
10
|
class << self
|
|
11
|
-
def list(options = {})
|
|
12
|
-
GoodData
|
|
13
|
-
GoodData::Process[:all]
|
|
14
|
-
end
|
|
11
|
+
def list(options = { :client => GoodData.connection, :project => GoodData.project })
|
|
12
|
+
GoodData::Process[:all, options]
|
|
15
13
|
end
|
|
16
14
|
|
|
17
15
|
def get(options = {})
|
|
18
|
-
|
|
19
|
-
fail '
|
|
16
|
+
pid = options[:project_id]
|
|
17
|
+
fail ArgumentError, 'None or invalid project_id specified' if pid.nil? || pid.empty?
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
id = options[:process_id]
|
|
20
|
+
fail ArgumentError, 'None or invalid process_id' if id.nil? || id.empty?
|
|
21
|
+
c = options[:client]
|
|
22
|
+
c.with_project(pid) do |project|
|
|
23
|
+
project.processes(id)
|
|
23
24
|
end
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
def delete(process_id, options = {})
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
def delete(process_id, options = { :client => GoodData.connection, :project => GoodData.project })
|
|
28
|
+
c = options[:client]
|
|
29
|
+
pid = options[:project_id]
|
|
30
|
+
process = c.with_project(pid) do |project|
|
|
31
|
+
project.processes(process_id)
|
|
30
32
|
end
|
|
33
|
+
process.delete
|
|
31
34
|
end
|
|
32
35
|
|
|
33
36
|
# TODO: check files_to_exclude param. Does it do anything? It should check that in case of using CLI, it makes sure the files are not deployed
|
|
34
|
-
def deploy(dir, options = {})
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
def deploy(dir, options = { :client => GoodData.connection, :project => GoodData.project })
|
|
38
|
+
params = options[:params].nil? ? [] : [options[:params]]
|
|
39
|
+
c = options[:client]
|
|
40
|
+
pid = options[:project_id]
|
|
41
|
+
c.with_project(pid) do |project|
|
|
42
|
+
project.deploy_process(dir, options.merge(:files_to_exclude => params))
|
|
38
43
|
end
|
|
39
44
|
end
|
|
40
45
|
|
|
41
|
-
def execute_process(process_id, executable, options = {})
|
|
42
|
-
GoodData
|
|
43
|
-
|
|
44
|
-
process.execute_process(executable, options)
|
|
45
|
-
end
|
|
46
|
+
def execute_process(process_id, executable, options = { :client => GoodData.connection, :project => GoodData.project })
|
|
47
|
+
process = GoodData::Process[process_id, options]
|
|
48
|
+
process.execute_process(executable, options)
|
|
46
49
|
end
|
|
47
50
|
|
|
48
|
-
def run(dir, executable, options = {})
|
|
51
|
+
def run(dir, executable, options = { :client => GoodData.connection, :project => GoodData.project })
|
|
49
52
|
verbose = options[:v]
|
|
50
53
|
dir = Pathname(dir)
|
|
51
54
|
name = options[:name] || "Temporary deploy[#{dir}][#{options[:project_name]}]"
|
|
52
55
|
|
|
53
|
-
GoodData::Process.with_deploy(dir, options.merge(:name => name)) do |process|
|
|
56
|
+
GoodData::Process.with_deploy(dir, options.merge(:name => name, :project_id => ProjectHelper::PROJECT_ID)) do |process|
|
|
54
57
|
puts HighLine.color('Executing', HighLine::BOLD) if verbose
|
|
55
58
|
process.execute(executable, options)
|
|
56
59
|
end
|
|
@@ -7,39 +7,49 @@ module GoodData
|
|
|
7
7
|
class Project
|
|
8
8
|
class << self
|
|
9
9
|
# Create new project based on options supplied
|
|
10
|
-
def create(options = {})
|
|
10
|
+
def create(options = { client: GoodData.connection })
|
|
11
11
|
title = options[:title]
|
|
12
12
|
summary = options[:summary]
|
|
13
13
|
template = options[:template]
|
|
14
14
|
token = options[:token]
|
|
15
|
-
|
|
16
|
-
GoodData::Project.create(:title => title, :summary => summary, :template => template, :auth_token => token)
|
|
15
|
+
client = options[:client]
|
|
16
|
+
GoodData::Project.create(:title => title, :summary => summary, :template => template, :auth_token => token, :client => client)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
# Show existing project
|
|
20
|
-
def show(id)
|
|
21
|
-
|
|
20
|
+
def show(id, options = { client: GoodData.connection })
|
|
21
|
+
client = options[:client]
|
|
22
|
+
client.projects(id)
|
|
22
23
|
end
|
|
23
24
|
|
|
24
|
-
def invite(project_id, email, role, msg = GoodData::Project::DEFAULT_INVITE_MESSAGE)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
project = GoodData::Project[project_id]
|
|
25
|
+
def invite(project_id, email, role, msg = GoodData::Project::DEFAULT_INVITE_MESSAGE, options = {})
|
|
26
|
+
client = options[:client]
|
|
27
|
+
project = client.projects(project_id)
|
|
28
28
|
fail "Invalid project id '#{project_id}' specified" if project.nil?
|
|
29
29
|
|
|
30
30
|
project.invite(email, role, msg)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# Clone existing project
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
#
|
|
35
|
+
# @param project_id [String | GoodData::Project] Project id or project instance to delete
|
|
36
|
+
# @option options [String] :data Clone including all the data (default true)
|
|
37
|
+
# @option options [String] :users Clone including all the users (default false)
|
|
38
|
+
# @option options [String] :title Name of the cloned project (default "Clone of {old_project_title}")
|
|
39
|
+
# @option options [Boolean] :verbose (false) Switch on verbose mode for detailed logging
|
|
40
|
+
def clone(project_id, options = { client: GoodData.connection })
|
|
41
|
+
client = options[:client]
|
|
42
|
+
client.with_project(project_id) do |project|
|
|
36
43
|
project.clone(options)
|
|
37
44
|
end
|
|
38
45
|
end
|
|
39
46
|
|
|
40
|
-
#
|
|
41
|
-
|
|
42
|
-
|
|
47
|
+
# Deletes existing project
|
|
48
|
+
#
|
|
49
|
+
# @param project_id [String | GoodData::Project] Project id or project instance to delete
|
|
50
|
+
def delete(project_id, options = { client: GoodData.connection })
|
|
51
|
+
client = options[:client]
|
|
52
|
+
p = client.projects(project_id)
|
|
43
53
|
p.delete
|
|
44
54
|
end
|
|
45
55
|
|
|
@@ -62,47 +72,35 @@ module GoodData
|
|
|
62
72
|
[spec, goodfile[:project_id]]
|
|
63
73
|
end
|
|
64
74
|
|
|
65
|
-
def list_users(pid)
|
|
66
|
-
users = []
|
|
67
|
-
finished = false
|
|
68
|
-
offset = 0
|
|
69
|
-
# Limit set to 1000 to be safe
|
|
70
|
-
limit = 1000
|
|
71
|
-
until finished
|
|
72
|
-
result = GoodData.get('/gdc/projects/#{pid}/users?offset=#{offset}&limit=#{limit}')
|
|
73
|
-
result['users'].map do |u|
|
|
74
|
-
as = u['user']
|
|
75
|
-
users.push(
|
|
76
|
-
:login => as['content']['email'],
|
|
77
|
-
:uri => as['links']['self'],
|
|
78
|
-
:first_name => as['content']['firstname'],
|
|
79
|
-
:last_name => as['content']['lastname'],
|
|
80
|
-
:role => as['content']['userRoles'].first,
|
|
81
|
-
:status => as['content']['status']
|
|
82
|
-
)
|
|
83
|
-
end
|
|
84
|
-
if result['users'].count == limit
|
|
85
|
-
offset += limit
|
|
86
|
-
else
|
|
87
|
-
finished = true
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
users
|
|
91
|
-
end
|
|
92
|
-
|
|
93
75
|
# Update project
|
|
94
|
-
def update(
|
|
95
|
-
|
|
96
|
-
|
|
76
|
+
def update(opts = { client: GoodData.connection })
|
|
77
|
+
client = opts[:client]
|
|
78
|
+
fail ArgumentError, 'No :client specified' if client.nil?
|
|
79
|
+
|
|
80
|
+
p = opts[:project]
|
|
81
|
+
fail ArgumentError, 'No :project specified' if p.nil?
|
|
82
|
+
|
|
83
|
+
project = GoodData::Project[p, opts]
|
|
84
|
+
fail ArgumentError, 'Wrong :project specified' if project.nil?
|
|
85
|
+
|
|
86
|
+
GoodData::Model::ProjectCreator.migrate(:spec => opts[:spec], :client => client, :project => project)
|
|
97
87
|
end
|
|
98
88
|
|
|
99
89
|
# Build project
|
|
100
|
-
def build(
|
|
101
|
-
|
|
90
|
+
def build(opts = { client: GoodData.connection })
|
|
91
|
+
client = opts[:client]
|
|
92
|
+
fail ArgumentError, 'No :client specified' if client.nil?
|
|
93
|
+
|
|
94
|
+
GoodData::Model::ProjectCreator.migrate(:spec => opts[:spec], :token => opts[:token], :client => client)
|
|
102
95
|
end
|
|
103
96
|
|
|
104
|
-
|
|
105
|
-
|
|
97
|
+
# Performs project validation
|
|
98
|
+
#
|
|
99
|
+
# @param project_id [String | GoodData::Project] Project id or project instance to validate
|
|
100
|
+
# @return [Object] Report of found problems
|
|
101
|
+
def validate(project_id, options = { client: GoodData.connection })
|
|
102
|
+
client = options[:client]
|
|
103
|
+
client.with_project(project_id) do |p|
|
|
106
104
|
p.validate
|
|
107
105
|
end
|
|
108
106
|
end
|
|
@@ -120,7 +118,11 @@ module GoodData
|
|
|
120
118
|
|
|
121
119
|
begin
|
|
122
120
|
require 'gooddata'
|
|
123
|
-
GoodData.
|
|
121
|
+
client = GoodData.connect(options)
|
|
122
|
+
|
|
123
|
+
GoodData.with_project(project_id, :client => client) do |project|
|
|
124
|
+
fail ArgumentError, 'Wrong project specified' if project.nil?
|
|
125
|
+
|
|
124
126
|
puts "Use 'exit' to quit the live session. Use 'q' to jump out of displaying a large output."
|
|
125
127
|
binding.pry(:quiet => true,
|
|
126
128
|
:prompt => [proc do |target_self, nest_level, pry|
|
|
@@ -143,6 +145,28 @@ module GoodData
|
|
|
143
145
|
spin_session.call({}, nil)
|
|
144
146
|
end
|
|
145
147
|
end
|
|
148
|
+
|
|
149
|
+
# Lists roles in a project
|
|
150
|
+
#
|
|
151
|
+
# @param project_id [String | GoodData::Project] Project id or project instance to list the users in
|
|
152
|
+
# @return [Array <GoodData::Role>] List of project roles
|
|
153
|
+
def roles(project_id, options = { client: GoodData.connection })
|
|
154
|
+
client = options[:client]
|
|
155
|
+
client.with_project(project_id) do |p|
|
|
156
|
+
p.roles
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Lists users in a project
|
|
161
|
+
#
|
|
162
|
+
# @param project_id [String | GoodData::Project] Project id or project instance to list the users in
|
|
163
|
+
# @return [Array <GoodData::Membership>] List of project users
|
|
164
|
+
def users(project_id, options = { client: GoodData.connection })
|
|
165
|
+
client = options[:client]
|
|
166
|
+
client.with_project(project_id) do |p|
|
|
167
|
+
p.users
|
|
168
|
+
end
|
|
169
|
+
end
|
|
146
170
|
end
|
|
147
171
|
end
|
|
148
172
|
end
|
|
@@ -6,12 +6,18 @@ module GoodData
|
|
|
6
6
|
module Command
|
|
7
7
|
class Role
|
|
8
8
|
class << self
|
|
9
|
-
def list(pid)
|
|
10
|
-
|
|
9
|
+
def list(pid, opts = { :client => GoodData.connection, :project => GoodData.project })
|
|
10
|
+
p = opts[:project]
|
|
11
|
+
fail ArgumentError, 'No :project specified' if p.nil?
|
|
12
|
+
|
|
13
|
+
project = GoodData::Project[p, opts]
|
|
14
|
+
fail ArgumentError, 'Wrong :project specified' if project.nil?
|
|
15
|
+
|
|
16
|
+
roles_response = client.get("/gdc/projects/#{project.pid}/roles")
|
|
11
17
|
|
|
12
18
|
roles = {}
|
|
13
19
|
roles_response['projectRoles']['roles'].each do |role_uri|
|
|
14
|
-
r =
|
|
20
|
+
r = client.get(role_uri)
|
|
15
21
|
identifier = r['projectRole']['meta']['identifier']
|
|
16
22
|
roles[identifier] = {
|
|
17
23
|
:user_uri => r['projectRole']['links']['roleUsers'],
|