dtk-shell 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +5 -0
- data/Gemfile_dev +13 -0
- data/README.md +121 -0
- data/bin/dtk-execute +32 -0
- data/bin/dtk-run +92 -0
- data/bin/dtk-shell +31 -0
- data/dtk-shell.gemspec +50 -0
- data/lib/auxiliary.rb +61 -0
- data/lib/bundler_monkey_patch.rb +26 -0
- data/lib/client.rb +58 -0
- data/lib/command_helper.rb +33 -0
- data/lib/command_helpers/git_repo.rb +589 -0
- data/lib/command_helpers/git_repo/merge.rb +153 -0
- data/lib/command_helpers/jenkins_client.rb +106 -0
- data/lib/command_helpers/jenkins_client/config_xml.rb +288 -0
- data/lib/command_helpers/service_importer.rb +251 -0
- data/lib/command_helpers/service_link.rb +33 -0
- data/lib/command_helpers/test_module_creator.rb +69 -0
- data/lib/command_helpers/test_module_templates/dtk.model.yaml.eruby +10 -0
- data/lib/command_helpers/test_module_templates/spec_helper.rb.eruby +10 -0
- data/lib/command_helpers/test_module_templates/temp_component_spec.rb.eruby +5 -0
- data/lib/commands.rb +57 -0
- data/lib/commands/common/thor/access_control.rb +133 -0
- data/lib/commands/common/thor/action_result_handler.rb +74 -0
- data/lib/commands/common/thor/assembly_template.rb +92 -0
- data/lib/commands/common/thor/assembly_workspace.rb +1801 -0
- data/lib/commands/common/thor/base_command_helper.rb +59 -0
- data/lib/commands/common/thor/clone.rb +82 -0
- data/lib/commands/common/thor/common.rb +88 -0
- data/lib/commands/common/thor/common_base.rb +49 -0
- data/lib/commands/common/thor/create_target.rb +70 -0
- data/lib/commands/common/thor/edit.rb +255 -0
- data/lib/commands/common/thor/inventory_parser.rb +98 -0
- data/lib/commands/common/thor/list_diffs.rb +128 -0
- data/lib/commands/common/thor/module.rb +1011 -0
- data/lib/commands/common/thor/module/import.rb +210 -0
- data/lib/commands/common/thor/node.rb +53 -0
- data/lib/commands/common/thor/poller.rb +65 -0
- data/lib/commands/common/thor/pull_clone_changes.rb +28 -0
- data/lib/commands/common/thor/pull_from_remote.rb +152 -0
- data/lib/commands/common/thor/puppet_forge.rb +72 -0
- data/lib/commands/common/thor/purge_clone.rb +101 -0
- data/lib/commands/common/thor/push_clone_changes.rb +162 -0
- data/lib/commands/common/thor/push_to_remote.rb +94 -0
- data/lib/commands/common/thor/remotes.rb +71 -0
- data/lib/commands/common/thor/reparse.rb +40 -0
- data/lib/commands/common/thor/set_required_attributes.rb +46 -0
- data/lib/commands/thor/account.rb +239 -0
- data/lib/commands/thor/assembly.rb +356 -0
- data/lib/commands/thor/attribute.rb +79 -0
- data/lib/commands/thor/component.rb +70 -0
- data/lib/commands/thor/component_module.rb +501 -0
- data/lib/commands/thor/component_template.rb +174 -0
- data/lib/commands/thor/dependency.rb +34 -0
- data/lib/commands/thor/developer.rb +144 -0
- data/lib/commands/thor/dtk.rb +152 -0
- data/lib/commands/thor/library.rb +125 -0
- data/lib/commands/thor/node.rb +504 -0
- data/lib/commands/thor/node_template.rb +94 -0
- data/lib/commands/thor/project.rb +34 -0
- data/lib/commands/thor/provider.rb +233 -0
- data/lib/commands/thor/remotes.rb +49 -0
- data/lib/commands/thor/service.rb +941 -0
- data/lib/commands/thor/service_module.rb +914 -0
- data/lib/commands/thor/state_change.rb +25 -0
- data/lib/commands/thor/target.rb +250 -0
- data/lib/commands/thor/task.rb +116 -0
- data/lib/commands/thor/test_module.rb +310 -0
- data/lib/commands/thor/utils.rb +21 -0
- data/lib/commands/thor/workspace.rb +685 -0
- data/lib/config/cacert.pem +3785 -0
- data/lib/config/client.conf.header +20 -0
- data/lib/config/configuration.rb +99 -0
- data/lib/config/default.conf +16 -0
- data/lib/config/disk_cacher.rb +80 -0
- data/lib/configurator.rb +176 -0
- data/lib/context_router.rb +44 -0
- data/lib/core.rb +497 -0
- data/lib/domain/git_adapter.rb +412 -0
- data/lib/domain/git_error_handler.rb +64 -0
- data/lib/domain/response.rb +285 -0
- data/lib/domain/response/error_handler.rb +86 -0
- data/lib/dtk-shell/version.rb +20 -0
- data/lib/dtk_constants.rb +40 -0
- data/lib/dtk_error.rb +114 -0
- data/lib/dtk_logger.rb +126 -0
- data/lib/dtk_shell.rb +31 -0
- data/lib/error.rb +85 -0
- data/lib/execute.rb +29 -0
- data/lib/execute/cli_pure/cli_rerouter.rb +102 -0
- data/lib/execute/command.rb +40 -0
- data/lib/execute/command/api_call.rb +60 -0
- data/lib/execute/command/api_call/map.rb +60 -0
- data/lib/execute/command/api_call/service.rb +91 -0
- data/lib/execute/command/api_call/translation_term.rb +119 -0
- data/lib/execute/command/rest_call.rb +37 -0
- data/lib/execute/command_processor.rb +30 -0
- data/lib/execute/command_processor/rest_call.rb +59 -0
- data/lib/execute/error_usage.rb +21 -0
- data/lib/execute/execute_context.rb +86 -0
- data/lib/execute/execute_context/result_store.rb +37 -0
- data/lib/execute/script.rb +64 -0
- data/lib/execute/script/add_tenant.rb +121 -0
- data/lib/git-logs/git.log +0 -0
- data/lib/parser/adapters/option_parser.rb +70 -0
- data/lib/parser/adapters/thor.rb +555 -0
- data/lib/parser/adapters/thor/common_option_defs.rb +40 -0
- data/lib/require_first.rb +104 -0
- data/lib/search_hash.rb +44 -0
- data/lib/shell.rb +261 -0
- data/lib/shell/context.rb +1065 -0
- data/lib/shell/context_aux.rb +46 -0
- data/lib/shell/domain/active_context.rb +186 -0
- data/lib/shell/domain/context_entity.rb +89 -0
- data/lib/shell/domain/context_params.rb +223 -0
- data/lib/shell/domain/override_tasks.rb +88 -0
- data/lib/shell/domain/shadow_entity.rb +76 -0
- data/lib/shell/header_shell.rb +44 -0
- data/lib/shell/help_monkey_patch.rb +283 -0
- data/lib/shell/interactive_wizard.rb +225 -0
- data/lib/shell/message_queue.rb +63 -0
- data/lib/shell/parse_monkey_patch.rb +39 -0
- data/lib/shell/status_monitor.rb +124 -0
- data/lib/task_status.rb +83 -0
- data/lib/task_status/refresh_mode.rb +77 -0
- data/lib/task_status/snapshot_mode.rb +28 -0
- data/lib/task_status/stream_mode.rb +48 -0
- data/lib/task_status/stream_mode/element.rb +101 -0
- data/lib/task_status/stream_mode/element/format.rb +101 -0
- data/lib/task_status/stream_mode/element/hierarchical_task.rb +100 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/result.rb +72 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/result/action.rb +93 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/result/components.rb +26 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/result/node_level.rb +26 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/steps.rb +34 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/steps/action.rb +53 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/steps/components.rb +53 -0
- data/lib/task_status/stream_mode/element/hierarchical_task/steps/node_level.rb +42 -0
- data/lib/task_status/stream_mode/element/no_results.rb +26 -0
- data/lib/task_status/stream_mode/element/render.rb +59 -0
- data/lib/task_status/stream_mode/element/stage.rb +84 -0
- data/lib/task_status/stream_mode/element/stage/render.rb +76 -0
- data/lib/task_status/stream_mode/element/task_end.rb +35 -0
- data/lib/task_status/stream_mode/element/task_start.rb +37 -0
- data/lib/util/common_util.rb +37 -0
- data/lib/util/console.rb +235 -0
- data/lib/util/dtk_puppet.rb +65 -0
- data/lib/util/module_util.rb +66 -0
- data/lib/util/os_util.rb +385 -0
- data/lib/util/permission_util.rb +31 -0
- data/lib/util/remote_dependency_util.rb +84 -0
- data/lib/util/ssh_util.rb +94 -0
- data/lib/view_processor.rb +129 -0
- data/lib/view_processor/augmented_simple_list.rb +44 -0
- data/lib/view_processor/hash_pretty_print.rb +123 -0
- data/lib/view_processor/simple_list.rb +156 -0
- data/lib/view_processor/table_print.rb +309 -0
- data/lib/violation.rb +86 -0
- data/lib/violation/attribute.rb +76 -0
- data/lib/violation/fix.rb +26 -0
- data/lib/violation/fix/result.rb +73 -0
- data/lib/violation/fix/result/error.rb +34 -0
- data/lib/violation/fix/set_attribute.rb +41 -0
- data/lib/violation/sub_classes.rb +60 -0
- data/puppet/manifests/init.pp +72 -0
- data/puppet/manifests/params.pp +16 -0
- data/puppet/r8meta.puppet.yml +35 -0
- data/puppet/templates/bash_profile.erb +2 -0
- data/puppet/templates/client.conf.erb +1 -0
- data/puppet/templates/dtkclient.erb +2 -0
- data/spec/component_module_spec.rb +34 -0
- data/spec/dependency_spec.rb +6 -0
- data/spec/dtk_shell_spec.rb +13 -0
- data/spec/dtk_spec.rb +33 -0
- data/spec/lib/spec_helper.rb +10 -0
- data/spec/lib/spec_thor.rb +108 -0
- data/spec/node_template_spec.rb +24 -0
- data/spec/project_spec.rb +6 -0
- data/spec/repo_spec.rb +7 -0
- data/spec/response_spec.rb +52 -0
- data/spec/service_module_spec.rb +38 -0
- data/spec/service_spec.rb +50 -0
- data/spec/state_change_spec.rb +7 -0
- data/spec/table_print_spec.rb +48 -0
- data/spec/target_spec.rb +57 -0
- data/spec/task_spec.rb +28 -0
- data/views/assembly/augmented_simple_list.rb +12 -0
- data/views/assembly_template/augmented_simple_list.rb +12 -0
- data/views/list_task/augmented_simple_list.rb +12 -0
- metadata +421 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
3
|
+
#
|
4
|
+
# This file is part of the dtk project.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
require 'erubis'
|
19
|
+
module DTK
|
20
|
+
module Client
|
21
|
+
class ViewProcSimpleList < ViewProcessor
|
22
|
+
def render(hash)
|
23
|
+
pp_adapter = ViewProcessor.get_adapter("hash_pretty_print",@command_class,@data_type_index)
|
24
|
+
ordered_hash = pp_adapter.render(hash)
|
25
|
+
if ordered_hash.size == 1
|
26
|
+
render_simple_assignment(ordered_hash.keys.first,ordered_hash.values.first)
|
27
|
+
else
|
28
|
+
render_ordered_hash(ordered_hash)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
private
|
32
|
+
#TODO Aldin check if assembly or assembly_name
|
33
|
+
HIDE_FROM_VIEW = ["assembly"]
|
34
|
+
def render_simple_assignment(key,val)
|
35
|
+
key + KeyValSeperator + val.to_s + "\n"
|
36
|
+
end
|
37
|
+
def render_ordered_hash(ordered_hash,ident_info={},index=1)
|
38
|
+
#find next value that is type pretty print hash or array
|
39
|
+
beg,nested,rest = find_first_non_scalar(ordered_hash)
|
40
|
+
ret = String.new
|
41
|
+
unless beg.empty?
|
42
|
+
ret = simple_value_render(beg,ident_info.merge(:index => index))
|
43
|
+
end
|
44
|
+
unless nested.empty?
|
45
|
+
ident_info_nested = {
|
46
|
+
:ident => (ident_info[:ident]||0) +IdentAdd,
|
47
|
+
:nested_key => nested.keys.first
|
48
|
+
}
|
49
|
+
ident_info_nested[:ident] += IdentAdd
|
50
|
+
ret << "#{ident_str(ident_info_nested[:ident])}#{nested.keys.first.upcase}\n"
|
51
|
+
vals = nested.values.first
|
52
|
+
vals = [vals] unless vals.kind_of?(Array)
|
53
|
+
vals.each_with_index{|val,i|ret << render_ordered_hash(val,ident_info_nested,i+1)}
|
54
|
+
end
|
55
|
+
unless rest.empty?
|
56
|
+
rest = hide_from_view(rest)
|
57
|
+
ret << render_ordered_hash(rest,ident_info.merge(:include_first_key => true))
|
58
|
+
end
|
59
|
+
ret
|
60
|
+
end
|
61
|
+
|
62
|
+
def hide_from_view(ordered_hash)
|
63
|
+
ordered_hash.each do |k,v|
|
64
|
+
ordered_hash.delete_if{|k,v| HIDE_FROM_VIEW.include?(k)}
|
65
|
+
end
|
66
|
+
return ordered_hash
|
67
|
+
end
|
68
|
+
|
69
|
+
# Exclude = ["op_status","assembly_template"]
|
70
|
+
IdentAdd = 2
|
71
|
+
def find_first_non_scalar(ordered_hash)
|
72
|
+
found = nil
|
73
|
+
keys = ordered_hash.keys
|
74
|
+
keys.each_with_index do |k,i|
|
75
|
+
val = ordered_hash[k]
|
76
|
+
if val.kind_of?(ViewPrettyPrintHash) or
|
77
|
+
(val.kind_of?(Array) and val.size > 0 and val.first.kind_of?(ViewPrettyPrintHash))
|
78
|
+
found = i
|
79
|
+
break
|
80
|
+
end
|
81
|
+
end
|
82
|
+
if found.nil?
|
83
|
+
empty_ordered_hash = ordered_hash.class.new
|
84
|
+
[ordered_hash,empty_ordered_hash,empty_ordered_hash]
|
85
|
+
else
|
86
|
+
[keys[0,found],keys[found,1],keys[found+1,keys.size-1]].map{|key_array|ordered_hash.slice(*key_array)}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
def is_scalar_type?(x)
|
90
|
+
[String,Fixnum,Bignum].find{|t|x.kind_of?(t)}
|
91
|
+
end
|
92
|
+
|
93
|
+
def convert_to_string_form(val)
|
94
|
+
if val.kind_of?(Array)
|
95
|
+
"[#{val.map{|el|convert_to_string_form(el)}.join(",")}]"
|
96
|
+
elsif is_scalar_type?(val)
|
97
|
+
val.to_s
|
98
|
+
else #catchall
|
99
|
+
pp_form val
|
100
|
+
end
|
101
|
+
end
|
102
|
+
def pp_form(obj)
|
103
|
+
ret = String.new
|
104
|
+
PP.pp obj, ret
|
105
|
+
ret.chomp!
|
106
|
+
end
|
107
|
+
|
108
|
+
def ident_str(n)
|
109
|
+
Array.new(n, " ").join
|
110
|
+
end
|
111
|
+
|
112
|
+
#process elements that are not scalars
|
113
|
+
def proc_ordered_hash(ordered_hash)
|
114
|
+
updated_els = Hash.new
|
115
|
+
ordered_hash.each do |k,v|
|
116
|
+
unless is_scalar_type?(v)
|
117
|
+
updated_els[k] = convert_to_string_form(v)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
ordered_hash.merge(updated_els)
|
122
|
+
end
|
123
|
+
|
124
|
+
def simple_value_render(ordered_hash,ident_info)
|
125
|
+
|
126
|
+
proc_ordered_hash = proc_ordered_hash(ordered_hash)
|
127
|
+
|
128
|
+
ident = ident_info[:ident]||0
|
129
|
+
first_prefix = (ident_info[:include_first_key] ?
|
130
|
+
(ident_str(ident+IdentAdd) + ordered_hash.keys.first + KeyValSeperator) : ident_str(ident))
|
131
|
+
first_suffix = ((ident_info[:include_first_key] or not ordered_hash.object_type) ? "" : " (#{ordered_hash.object_type})")
|
132
|
+
rest_prefix = ident_str(ident+IdentAdd)
|
133
|
+
|
134
|
+
template_bindings = {
|
135
|
+
:ordered_hash => proc_ordered_hash,
|
136
|
+
:first_prefix => first_prefix,
|
137
|
+
:first_suffix => first_suffix,
|
138
|
+
:rest_prefix => rest_prefix,
|
139
|
+
:sep => KeyValSeperator
|
140
|
+
}
|
141
|
+
|
142
|
+
SimpleListTemplate.result(template_bindings)
|
143
|
+
end
|
144
|
+
KeyValSeperator = ": "
|
145
|
+
SimpleListTemplate = Erubis::Eruby.new <<eos
|
146
|
+
<% keys = ordered_hash.keys %>
|
147
|
+
<% first = keys.shift %>
|
148
|
+
<%= rest_prefix %><%= first_prefix.strip %><%= ordered_hash[first] %>
|
149
|
+
<% keys.each do |k| %>
|
150
|
+
<%= rest_prefix %><%= k %><%= sep %><%= ordered_hash[k] %>
|
151
|
+
<% end %>
|
152
|
+
eos
|
153
|
+
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,309 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
3
|
+
#
|
4
|
+
# This file is part of the dtk project.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
require 'hirb'
|
19
|
+
require 'ostruct'
|
20
|
+
require 'colorize'
|
21
|
+
require 'rest_client'
|
22
|
+
require 'json'
|
23
|
+
|
24
|
+
dtk_require("../config/disk_cacher")
|
25
|
+
|
26
|
+
# we override String here to give power to our mutators defined in TableDefintions
|
27
|
+
class String
|
28
|
+
def get_date
|
29
|
+
DateTime.parse(self).strftime('%H:%M:%S %d/%m/%y') unless self.nil?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# override OpenStruct to remove defintion for id
|
34
|
+
class DtkOpenStruct < OpenStruct
|
35
|
+
if RUBY_VERSION.match(/^1\.8\..*$/)
|
36
|
+
undef id
|
37
|
+
undef type
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# [Haris]
|
42
|
+
# Elements with action column (taks status) have been removed since they are no longer in use. In case of bug that is relying
|
43
|
+
# on existance of element and logic, please contact me to resolve it.
|
44
|
+
#
|
45
|
+
|
46
|
+
module DTK
|
47
|
+
module Client
|
48
|
+
class ViewProcTablePrint < ViewProcessor
|
49
|
+
def render(data, command_clazz, data_type_clazz, forced_metadata=nil, print_error_table=false)
|
50
|
+
DtkResponse.new(data, data_type_clazz, forced_metadata, print_error_table).print
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class DtkResponse
|
55
|
+
|
56
|
+
include Hirb::Console
|
57
|
+
include CommandBase
|
58
|
+
extend CommandBase
|
59
|
+
attr_accessor :command_name, :order_defintion, :evaluated_data
|
60
|
+
|
61
|
+
# when adding class to table view you need to define mapping and order to be displayed in table
|
62
|
+
# this can be fixed with facets, but that is todo for now TODO: use facets with ordered hashes
|
63
|
+
|
64
|
+
def initialize(data, data_type, forced_metadata, print_error_table)
|
65
|
+
# if there is no custom metadata, then we use metadata predefined in meta-response.json file
|
66
|
+
|
67
|
+
if forced_metadata.nil?
|
68
|
+
# get all table definitions from json file
|
69
|
+
@table_defintions = get_metadata()
|
70
|
+
# e.g. data type ASSEMBLY
|
71
|
+
@command_name = data_type
|
72
|
+
# e.g. ASSEMBLY => TableDefintions::ASSEMBLY
|
73
|
+
table_defintion = get_table_defintion(@command_name)
|
74
|
+
# e.g. ASSEMBLY => TableDefintions::ASSEMBLY_ORDER
|
75
|
+
@order_definition = get_table_defintion(@command_name, true)
|
76
|
+
else
|
77
|
+
# if there is custom metadata, check if it is in valid format
|
78
|
+
validate_forced_metadata(forced_metadata)
|
79
|
+
|
80
|
+
table_defintion = forced_metadata['mapping']
|
81
|
+
@order_definition = forced_metadata['order']
|
82
|
+
end
|
83
|
+
|
84
|
+
# if one defintion is missing we stop the execution
|
85
|
+
if table_defintion.nil? || @order_definition.nil?
|
86
|
+
raise DTK::Client::DtkError,"Missing table definition(s) for data type #{data_type}."
|
87
|
+
end
|
88
|
+
|
89
|
+
# transforms data to DtkOpenStruct
|
90
|
+
structured_data = []
|
91
|
+
|
92
|
+
# very important since rest of the code expect array to be used
|
93
|
+
data = [data] unless data.kind_of?(Array)
|
94
|
+
|
95
|
+
data.each do |data_element|
|
96
|
+
# special flag to filter out data not needed here
|
97
|
+
next if data_element['dtk_client_hidden']
|
98
|
+
|
99
|
+
structured_data << to_ostruct(data_element)
|
100
|
+
end
|
101
|
+
|
102
|
+
# we use array of OpenStruct to hold our evaluated values
|
103
|
+
@evaluated_data = []
|
104
|
+
@error_data = []
|
105
|
+
@action_data = []
|
106
|
+
structured_data.each do |structured_element|
|
107
|
+
evaluated_element = DtkOpenStruct.new
|
108
|
+
error_element = DtkOpenStruct.new
|
109
|
+
|
110
|
+
# based on mapping we set key = eval(value)
|
111
|
+
table_defintion.each do |k,v|
|
112
|
+
begin
|
113
|
+
# due to problems with space we have special way of handling error columns
|
114
|
+
# in such a way that those error will be specially printed later on
|
115
|
+
|
116
|
+
if print_error_table && k.include?('error')
|
117
|
+
error_message = value_of(structured_element, v)
|
118
|
+
server_error = nil
|
119
|
+
|
120
|
+
# here we see if there was an error if not we will skip this
|
121
|
+
# if so we add it to @error_data
|
122
|
+
|
123
|
+
if error_message.empty?
|
124
|
+
# no error message just add it as regular element
|
125
|
+
evaluated_element.send("#{k}=",value_of(structured_element, v))
|
126
|
+
else
|
127
|
+
error_index = ""
|
128
|
+
error_type = value_of(structured_element,'errors.dtk_type') || ""
|
129
|
+
|
130
|
+
val = value_of(structured_element,'dtk_type')||''
|
131
|
+
# extract e.g. 3.1.1.1 from '3.1.1.1 action' etc.
|
132
|
+
error_index = "[ #{val.scan( /\d+[,.]?\d?[,.]?\d?[,.]?\d?[,.]?\d?/ ).first} ]"
|
133
|
+
|
134
|
+
# original table takes that index
|
135
|
+
evaluated_element.send("#{k}=", error_index)
|
136
|
+
# we set new error element
|
137
|
+
error_element.id = error_index
|
138
|
+
|
139
|
+
if error_type == "user_error"
|
140
|
+
error_element.message = "[USER ERROR] " + error_message
|
141
|
+
elsif error_type == "test_error"
|
142
|
+
error_element.message = "[TEST ERROR] " + error_message
|
143
|
+
else
|
144
|
+
error_element.message = "[SERVER ERROR] " + error_message
|
145
|
+
end
|
146
|
+
|
147
|
+
# add it with other
|
148
|
+
@error_data << error_element
|
149
|
+
end
|
150
|
+
else
|
151
|
+
evaluated_element.send("#{k}=", value_of(structured_element, v))
|
152
|
+
# eval "evaluated_element.#{k}=structured_element.#{v}"
|
153
|
+
end
|
154
|
+
rescue NoMethodError => e
|
155
|
+
unless e.message.include? "nil:NilClass"
|
156
|
+
# when chaining comands there are situations where more complex strcture
|
157
|
+
# e.g. external_ref.region will not be there. So we are handling that case
|
158
|
+
# make sure when in development to disable this TODO: better solution needed
|
159
|
+
raise DTK::Client::DtkError,"Error with missing metadata occurred. There is a mistake in table metadata or unexpected data presented to table view."
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
@order_definition.delete('errors')
|
165
|
+
|
166
|
+
@evaluated_data << evaluated_element
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def get_metadata
|
171
|
+
content = DiskCacher.new.fetch("table_metadata", ::DTK::Configuration.get(:meta_table_ttl))
|
172
|
+
raise DTK::Client::DtkError, "Table metadata is empty, please contact DTK team." if content.empty?
|
173
|
+
return JSON.parse(content)
|
174
|
+
end
|
175
|
+
|
176
|
+
def to_ostruct(data)
|
177
|
+
result = data.inject({}) do |res, (k, v)|
|
178
|
+
k = safe_name(k)
|
179
|
+
case v
|
180
|
+
when Hash
|
181
|
+
res.store(k, to_ostruct(v))
|
182
|
+
res
|
183
|
+
when Array
|
184
|
+
res.store(k, v.each { |el| Hash === el ? to_ostruct(el) : el })
|
185
|
+
res
|
186
|
+
else
|
187
|
+
res.store(k,v)
|
188
|
+
res
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
DtkOpenStruct.new(result)
|
193
|
+
end
|
194
|
+
|
195
|
+
def safe_name(identifier)
|
196
|
+
(identifier == 'id' || identifier == 'type') ? "dtk_#{identifier}" : identifier
|
197
|
+
end
|
198
|
+
|
199
|
+
def get_table_defintion(name,is_order=false)
|
200
|
+
begin
|
201
|
+
@table_defintions[name.downcase][(is_order ? 'order' : 'mapping')]
|
202
|
+
rescue NameError => e
|
203
|
+
return nil
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
# Check if custom metadata is sent in valid format
|
208
|
+
def validate_forced_metadata(forced_metadata)
|
209
|
+
# if custom metadata does not contain order(Array) or mapping(Hash),then it's not valid metadata
|
210
|
+
unless (forced_metadata['order'].nil? || forced_metadata['mapping'].nil?)
|
211
|
+
return if (forced_metadata['order'].class.eql?(Array) && forced_metadata['mapping'].class.eql?(Hash))
|
212
|
+
end
|
213
|
+
|
214
|
+
raise DTK::Client::DtkError,"Provided table definition is not valid. Please review your order and mapping for provided definition: \n #{forced_metadata.inspect}"
|
215
|
+
end
|
216
|
+
|
217
|
+
def filter_remove_underscore(field)
|
218
|
+
|
219
|
+
end
|
220
|
+
|
221
|
+
def print
|
222
|
+
filter_remove_underscore = Proc.new { |header| header.gsub('_',' ').upcase }
|
223
|
+
# hirb print out of our evaluated data in order defined
|
224
|
+
# Available options can be viewed here: http://tagaholic.me/hirb/doc/classes/Hirb/Helpers/Table.html#M000008
|
225
|
+
table(@evaluated_data,{:fields => @order_definition,:escape_special_chars => true, :resize => false, :vertical => false, :header_filter => filter_remove_underscore })
|
226
|
+
|
227
|
+
# in case there were error we print those errors
|
228
|
+
unless @error_data.empty?
|
229
|
+
printf "\nERRORS: \n\n"
|
230
|
+
#table(@error_data,{:fields => [ :id, :message ]})
|
231
|
+
@error_data.each do |error_row|
|
232
|
+
printf "%15s %s\n", error_row.id.colorize(:yellow), error_row.message.colorize(:red)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
unless @action_data.empty?
|
237
|
+
printf " \n"
|
238
|
+
#table(@error_data,{:fields => [ :id, :message ]})
|
239
|
+
printed = []
|
240
|
+
@action_data.each do |action_row|
|
241
|
+
# printf "%15s\n"
|
242
|
+
# printf(" INFO: #{action_row.message.colorize(:yellow)} \n") #, action_row.id.colorize(:yellow), action_row.message.colorize(:yellow)
|
243
|
+
message = action_row.message
|
244
|
+
printf "%15s %s\n", "INFO:".colorize(:yellow), message.colorize(:yellow) unless printed.include?(message)
|
245
|
+
printed << message
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
private
|
251
|
+
|
252
|
+
# based on string sequence in mapped_command we are executing list of commands to follow
|
253
|
+
# so for value of "foo.bar.split('.').last" we will get 4 commands that will
|
254
|
+
# sequentaly be executed using values from previus results
|
255
|
+
def value_of(open_struct_object, mapped_command)
|
256
|
+
# split string by '.' delimiter keeping in mind to split when words only
|
257
|
+
commands = mapped_command.split(/\.(?=\w)/)
|
258
|
+
|
259
|
+
value = open_struct_object
|
260
|
+
commands.each do |command|
|
261
|
+
value = evaluate_command(value, command)
|
262
|
+
end
|
263
|
+
return value
|
264
|
+
end
|
265
|
+
|
266
|
+
|
267
|
+
def evaluate_command(value, command)
|
268
|
+
case
|
269
|
+
when command.include?('map{')
|
270
|
+
matched_data = command.match(/\['(.+)'\]/)
|
271
|
+
|
272
|
+
my_lambda = lambda{|_x| _x.map{|r|r["#{matched_data[1]}"]||[]}}
|
273
|
+
value = my_lambda.call(value)
|
274
|
+
|
275
|
+
raise DTK::Client::DtkError,"There is a mistake in table metadata: #{command.inspect}" if value.nil?
|
276
|
+
when command.include?('(')
|
277
|
+
# matches command and params e.g. split('.') => [1] split, [2] '.'
|
278
|
+
matched_data = command.match(/(.+)\((.+)\)/)
|
279
|
+
command, params = matched_data[1], matched_data[2]
|
280
|
+
value = value.send(command,params)
|
281
|
+
when command.include?('[')
|
282
|
+
# matches command such as first['foo']
|
283
|
+
matched_data = command.match(/(.+)\[(.+)\]/)
|
284
|
+
command, params = matched_data[1],matched_data[2]
|
285
|
+
|
286
|
+
value = evaluate_command(value,command)
|
287
|
+
value = value.send('[]',params)
|
288
|
+
when command.start_with?("list_")
|
289
|
+
matched_data = command.match(/list_(.+)/)
|
290
|
+
|
291
|
+
my_lambda = lambda{|_x| _x.map{|r|r["#{matched_data[1]}"]||[]}}
|
292
|
+
value = my_lambda.call(value)
|
293
|
+
|
294
|
+
raise DTK::Client::DtkError,"There is a mistake in table metadata: #{command.inspect}" if value.nil?
|
295
|
+
when command.start_with?("count_")
|
296
|
+
matched_data = command.match(/count_(.+)/)
|
297
|
+
|
298
|
+
my_lambda = lambda{|_x| _x.map{|r|r["#{matched_data[1]}"]||[]}.flatten.size}
|
299
|
+
value = my_lambda.call(value)
|
300
|
+
|
301
|
+
raise DTK::Client::DtkError,"There is a mistake in table metadata: #{command.inspect}" if value.nil?
|
302
|
+
else
|
303
|
+
value = value.send(command)
|
304
|
+
end
|
305
|
+
return value
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|