action_command 0.1.3 → 0.1.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/.byebug_history +5 -0
- data/.codeclimate.yml +1 -0
- data/.rubocop.yml +4 -0
- data/Gemfile.lock +33 -6
- data/README.md +62 -0
- data/action_command.gemspec +3 -0
- data/doc/ActionCommand/Executable.html +106 -19
- data/doc/ActionCommand/InputOutput.html +203 -70
- data/doc/ActionCommand/Result.html +938 -131
- data/doc/ActionCommand.html +405 -82
- data/doc/_index.html +45 -1
- data/doc/class_list.html +1 -1
- data/doc/file.README.html +61 -2
- data/doc/index.html +61 -2
- data/doc/method_list.html +224 -14
- data/doc/top-level-namespace.html +1 -1
- data/lib/action_command/executable.rb +6 -0
- data/lib/action_command/executable_transaction.rb +27 -0
- data/lib/action_command/input_output.rb +5 -0
- data/lib/action_command/log_parser.rb +105 -0
- data/lib/action_command/pretty_print_log_action.rb +114 -0
- data/lib/action_command/result.rb +106 -16
- data/lib/action_command/utils.rb +0 -5
- data/lib/action_command/version.rb +1 -1
- data/lib/action_command.rb +53 -6
- metadata +48 -2
@@ -103,7 +103,7 @@
|
|
103
103
|
</div>
|
104
104
|
|
105
105
|
<div id="footer">
|
106
|
-
Generated on
|
106
|
+
Generated on Mon Mar 7 14:27:17 2016 by
|
107
107
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
108
108
|
0.8.7.6 (ruby-2.2.3).
|
109
109
|
</div>
|
@@ -34,6 +34,12 @@ module ActionCommand
|
|
34
34
|
def rake_context?
|
35
35
|
return root_context == ActionCommand::CONTEXT_RAKE
|
36
36
|
end
|
37
|
+
|
38
|
+
# @return true if this command was executed using ActionCommand.execute_api
|
39
|
+
def api_context?
|
40
|
+
return root_context == ActionCommand::CONTEXT_API
|
41
|
+
end
|
42
|
+
|
37
43
|
|
38
44
|
# @return true if this command is a child of another command
|
39
45
|
def child_context?
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module ActionCommand
|
2
|
+
# Root class for action commands that can be executed by this library.
|
3
|
+
# Override execute_internal to implement one, call one of the variants
|
4
|
+
# of ActionCommand.execute_... to execute one.
|
5
|
+
class ExecutableTransaction < Executable
|
6
|
+
|
7
|
+
# starts a transaction only if we are not already within one.
|
8
|
+
def execute(result)
|
9
|
+
if ActiveRecord::Base.connection.open_transactions >= 1
|
10
|
+
super(result)
|
11
|
+
else
|
12
|
+
result.info('start_transaction')
|
13
|
+
ActiveRecord::Base.transaction do
|
14
|
+
super(result)
|
15
|
+
if result.ok?
|
16
|
+
result.info('end_transaction')
|
17
|
+
else
|
18
|
+
result.info('rollback_transaction')
|
19
|
+
raise ActiveRecord::Rollback, 'rollback transaction'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -126,6 +126,11 @@ module ActionCommand
|
|
126
126
|
insert_io(@input, sym, desc, opts)
|
127
127
|
end
|
128
128
|
|
129
|
+
# Defines output for a command
|
130
|
+
# @param sym [Symbol] symbol identifying the parameter
|
131
|
+
# @param desc [String] description for use by internal developers, or on a rake task with
|
132
|
+
# rake your_task_name[help]
|
133
|
+
# @param opts Optional arguments.
|
129
134
|
def output(sym, desc, opts = {})
|
130
135
|
insert_io(@output, sym, desc, opts)
|
131
136
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
|
2
|
+
# Unnecessary comment for rubocop
|
3
|
+
module ActionCommand
|
4
|
+
|
5
|
+
# A single entry in the action command log
|
6
|
+
class LogMessage
|
7
|
+
|
8
|
+
attr_accessor :sequence, :cmd, :kind, :msg, :key
|
9
|
+
|
10
|
+
# Create a new log message
|
11
|
+
def populate(line, msg)
|
12
|
+
@line = line
|
13
|
+
@sequence = msg['sequence']
|
14
|
+
@depth = msg['depth']
|
15
|
+
@cmd = msg['cmd']
|
16
|
+
@kind = msg['kind']
|
17
|
+
@msg = msg['msg']
|
18
|
+
@key = msg['key']
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return the number of parents the current command has
|
22
|
+
def depth
|
23
|
+
return @depth
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return true if this command is the root command
|
27
|
+
def root?
|
28
|
+
return @depth == 0
|
29
|
+
end
|
30
|
+
|
31
|
+
# @return the line that was used to create this message.
|
32
|
+
def line
|
33
|
+
return @line
|
34
|
+
end
|
35
|
+
|
36
|
+
def key?(key)
|
37
|
+
return @key == key
|
38
|
+
end
|
39
|
+
|
40
|
+
# @return true if the kinds equal (tolerant of string/symbol mismatch)
|
41
|
+
def kind?(kind)
|
42
|
+
kind = kind.to_s
|
43
|
+
return @kind == kind
|
44
|
+
end
|
45
|
+
|
46
|
+
# @return true if the cmds equal (tolerant of being passed a class)
|
47
|
+
def command?(cmd)
|
48
|
+
cmd = cmd.name if cmd.is_a? Class
|
49
|
+
return @cmd == cmd
|
50
|
+
end
|
51
|
+
|
52
|
+
# @ return true if msgs equal
|
53
|
+
def match_message?(msg)
|
54
|
+
return @msg == msg unless msg.is_a? Hash
|
55
|
+
msg.each do |k, v|
|
56
|
+
k = k.to_s if k.is_a? Symbol
|
57
|
+
return false unless @msg.key?(k)
|
58
|
+
return false unless @msg[k] == v
|
59
|
+
end
|
60
|
+
return true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# reads from a stream containing log statements, and returns
|
65
|
+
# LogMessage entries for them.
|
66
|
+
class LogParser
|
67
|
+
|
68
|
+
# Create a new log parser for an IO subclass
|
69
|
+
def initialize(stream, sequence = nil)
|
70
|
+
@stream = stream
|
71
|
+
@sequence = sequence
|
72
|
+
end
|
73
|
+
|
74
|
+
# Check if we have reached the end of the stream.
|
75
|
+
def eof?
|
76
|
+
return @stream.eof?
|
77
|
+
end
|
78
|
+
|
79
|
+
# Populates a message from the next line in the
|
80
|
+
def next(msg)
|
81
|
+
# be tolerant of the fact that there might be other
|
82
|
+
# stuff in the log file.
|
83
|
+
next_line do |input, line|
|
84
|
+
if input.key?('sequence')
|
85
|
+
msg.populate(line, input) unless @sequence && @sequence != input['sequence']
|
86
|
+
return true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
return false
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
def next_line
|
95
|
+
until @stream.eof?
|
96
|
+
line = @stream.readline
|
97
|
+
line.scan(/--\s+:\s+({.*})/) do |item|
|
98
|
+
input = JSON.parse(item[0])
|
99
|
+
yield input, line
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
|
2
|
+
module ActionCommand
|
3
|
+
|
4
|
+
# Action that parses a log and pretty prints the log,
|
5
|
+
# optionally filtering on a particular command sequence.
|
6
|
+
class PrettyPrintLogAction < Executable
|
7
|
+
attr_accessor :source, :dest, :sequence
|
8
|
+
|
9
|
+
# specifies the input/output for this command
|
10
|
+
def self.describe_io
|
11
|
+
return ActionCommand.describe_io(self, 'Command that does some logging') do |io|
|
12
|
+
io.input(:source, 'Stream to read')
|
13
|
+
io.input(:sequence, 'sequence to filter on', OPTIONAL)
|
14
|
+
io.input(:dest, 'Optional output stream, defaults to STDOUT', OPTIONAL)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# return the destination stream, default to STDOUT
|
19
|
+
def dest
|
20
|
+
@dest = STDOUT unless @dest
|
21
|
+
return @dest
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
|
27
|
+
# Say hello to the specified person.
|
28
|
+
def execute_internal(_result)
|
29
|
+
item = LogMessage.new
|
30
|
+
parser = LogParser.new(@source, @sequence)
|
31
|
+
sequences = {}
|
32
|
+
# keep track of sequences, and when you complete one, then print out the
|
33
|
+
# entire thing at once.
|
34
|
+
while parser.next(item)
|
35
|
+
if item.kind?(ActionCommand::LOG_KIND_COMMAND_OUTPUT) && item.root?
|
36
|
+
process_output(sequences, item)
|
37
|
+
else
|
38
|
+
process_other(sequences, item)
|
39
|
+
end
|
40
|
+
item = LogMessage.new
|
41
|
+
end
|
42
|
+
|
43
|
+
# print out any incomplete sequences
|
44
|
+
print_sequences(sequences)
|
45
|
+
end
|
46
|
+
|
47
|
+
def process_other(sequences, item)
|
48
|
+
sequences[item.sequence] = [] unless sequences.key?(item.sequence)
|
49
|
+
sequences[item.sequence] << item
|
50
|
+
end
|
51
|
+
|
52
|
+
def process_output(sequences, item)
|
53
|
+
seq = sequences[item.sequence]
|
54
|
+
sequences.delete(item.sequence)
|
55
|
+
seq << item
|
56
|
+
print_sequence(seq)
|
57
|
+
end
|
58
|
+
|
59
|
+
def print_sequences(sequences)
|
60
|
+
sequences.each do |_k, v|
|
61
|
+
print_sequence(v)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def print_sequence(sequence)
|
66
|
+
sequence.each_with_index do |item, _i|
|
67
|
+
print_sequence_item(item)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def print_sequence_item(item)
|
72
|
+
# indent
|
73
|
+
if item.kind?(ActionCommand::LOG_KIND_COMMAND_INPUT)
|
74
|
+
print_cmd_input(item)
|
75
|
+
elsif item.kind?(ActionCommand::LOG_KIND_COMMAND_OUTPUT)
|
76
|
+
print_cmd_output(item)
|
77
|
+
else
|
78
|
+
print_msg(item.depth + 1, item)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def print_cmd_output(item)
|
83
|
+
println(item.depth, 'output:')
|
84
|
+
print_msg(item.depth + 1, item)
|
85
|
+
end
|
86
|
+
|
87
|
+
def print_cmd_input(item)
|
88
|
+
result = item.cmd
|
89
|
+
result << " (#{item.sequence})" if item.root?
|
90
|
+
println(item.depth, result)
|
91
|
+
println(item.depth + 1, 'input:')
|
92
|
+
print_msg(item.depth + 2, item)
|
93
|
+
end
|
94
|
+
|
95
|
+
def print_msg(depth, item)
|
96
|
+
if item.msg.is_a? String
|
97
|
+
println(depth, item.msg)
|
98
|
+
return
|
99
|
+
end
|
100
|
+
|
101
|
+
item.msg.each do |k, v|
|
102
|
+
println(depth, "#{k}: #{v}")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def println(depth, line)
|
107
|
+
padding = ''.rjust(depth * 2)
|
108
|
+
dest.puts("#{padding}#{line}")
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
@@ -1,29 +1,79 @@
|
|
1
1
|
|
2
2
|
module ActionCommand
|
3
|
+
|
4
|
+
|
3
5
|
# The result of one or more commands being executed.
|
4
|
-
class Result
|
6
|
+
class Result # rubocop:disable Metrics/ClassLength
|
5
7
|
# By default, a command is ok?
|
6
|
-
def initialize
|
7
|
-
@
|
8
|
+
def initialize
|
9
|
+
@result_code = RESULT_CODE_OK
|
8
10
|
@values = [{}]
|
11
|
+
@logger = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
# set the logger for this result
|
15
|
+
def logger=(logger)
|
16
|
+
return unless logger
|
17
|
+
@sequence = SecureRandom.hex
|
18
|
+
@stack = []
|
9
19
|
@logger = logger
|
10
20
|
end
|
21
|
+
|
22
|
+
# @return true if logging is enabled.
|
23
|
+
def logging?
|
24
|
+
return !@logger.nil?
|
25
|
+
end
|
26
|
+
|
27
|
+
# display an debugging message to the logger, if there is one.
|
28
|
+
# @yield return a message or hash
|
29
|
+
def debug(msg = nil)
|
30
|
+
if @logger
|
31
|
+
json = build_log(msg || yield, ActionCommand::LOG_KIND_DEBUG)
|
32
|
+
@logger.info(json)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# display an informational message to the logger, if there is one.
|
37
|
+
# @yield return a message or hash
|
38
|
+
def info(msg = nil)
|
39
|
+
if @logger
|
40
|
+
json = build_log(msg || yield, ActionCommand::LOG_KIND_INFO)
|
41
|
+
@logger.info(json)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# display an error message to the logger, if there is one.
|
46
|
+
def error(msg)
|
47
|
+
@logger.error(build_log(msg, ActionCommand::LOG_KIND_ERROR)) if @logger
|
48
|
+
end
|
11
49
|
|
12
50
|
# Call this if your command implementation fails. Sets
|
13
51
|
# ok? to false on the result.
|
14
52
|
# @param msg [String] message describing the failure.
|
15
53
|
def failed(msg)
|
16
|
-
@
|
54
|
+
@result_code = RESULT_CODE_FAILED
|
55
|
+
error(msg)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Call this if your command implementation fails. Sets
|
59
|
+
# ok? to false on the result.
|
60
|
+
# @param msg [String] message describing the failure.
|
61
|
+
# @param result_code [Integer]
|
62
|
+
def failed_with_code(msg, result_code)
|
63
|
+
@result_code = result_code
|
17
64
|
error(msg)
|
18
65
|
end
|
19
66
|
|
20
67
|
# @return [Boolean] true, up until failed has been called at least once.
|
21
68
|
def ok?
|
22
|
-
return @
|
69
|
+
return @result_code == RESULT_CODE_OK
|
23
70
|
end
|
24
71
|
|
72
|
+
# @return [Integer] the current result code
|
73
|
+
attr_reader :result_code
|
74
|
+
|
25
75
|
# adds results under the subkey until pop is called
|
26
|
-
def push(key)
|
76
|
+
def push(key, cmd)
|
27
77
|
return unless key
|
28
78
|
old_cur = current
|
29
79
|
if old_cur.key?(key)
|
@@ -32,12 +82,14 @@ module ActionCommand
|
|
32
82
|
@values << {}
|
33
83
|
old_cur[key] = @values.last
|
34
84
|
end
|
85
|
+
@stack << { key: key, cmd: cmd } if @logger
|
35
86
|
end
|
36
87
|
|
37
88
|
# removes the current set of results from the stack.
|
38
89
|
def pop(key)
|
39
90
|
return unless key
|
40
91
|
@values.pop
|
92
|
+
@stack.pop if @logger
|
41
93
|
end
|
42
94
|
|
43
95
|
# returns the current hash of values we are operating on.
|
@@ -50,6 +102,11 @@ module ActionCommand
|
|
50
102
|
current[key] = val
|
51
103
|
end
|
52
104
|
|
105
|
+
# return the unique sequence id for the commands under this result
|
106
|
+
def sequence
|
107
|
+
return @sequence
|
108
|
+
end
|
109
|
+
|
53
110
|
# determine if a key exists in the result.
|
54
111
|
def key?(key)
|
55
112
|
return current.key?(key)
|
@@ -59,18 +116,51 @@ module ActionCommand
|
|
59
116
|
def [](key)
|
60
117
|
return current[key]
|
61
118
|
end
|
119
|
+
|
120
|
+
# Used internally to log the input parameters to a command
|
121
|
+
def log_input(params)
|
122
|
+
return unless @logger
|
123
|
+
output = params.reject { |k, _v| internal_key?(k) }
|
124
|
+
log_info_hash(output, ActionCommand::LOG_KIND_COMMAND_INPUT)
|
125
|
+
end
|
62
126
|
|
63
|
-
#
|
64
|
-
def
|
65
|
-
|
127
|
+
# Used internally to log the output parameters for a command.
|
128
|
+
def log_output
|
129
|
+
return unless @logger
|
130
|
+
# only log the first level parameters, subcommands will log
|
131
|
+
# their own output.
|
132
|
+
output = current.reject { |k, v| v.is_a?(Hash) || internal_key?(k) }
|
133
|
+
log_info_hash(output, ActionCommand::LOG_KIND_COMMAND_OUTPUT)
|
66
134
|
end
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
135
|
+
|
136
|
+
# Used internally to establish the class of the root command
|
137
|
+
def root_command(cls)
|
138
|
+
@stack << { key: nil, cmd: cls } if @logger
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
def internal_key?(k)
|
145
|
+
return k == :logger || k == :test || k == :parent
|
146
|
+
end
|
147
|
+
|
148
|
+
def log_info_hash(params, kind)
|
149
|
+
return unless @logger
|
150
|
+
@logger.info(build_log(params, kind))
|
151
|
+
end
|
152
|
+
|
153
|
+
def build_log(msg, kind)
|
154
|
+
cur = @stack.last
|
155
|
+
out = {
|
156
|
+
sequence: @sequence,
|
157
|
+
cmd: cur[:cmd].name,
|
158
|
+
depth: @stack.length - 1
|
159
|
+
}
|
160
|
+
out[:key] = cur[:key] if cur[:key]
|
161
|
+
out[:kind] = kind
|
162
|
+
out[:msg] = msg if msg
|
163
|
+
return JSON.generate(out)
|
73
164
|
end
|
74
|
-
|
75
165
|
end
|
76
166
|
end
|
data/lib/action_command/utils.rb
CHANGED
data/lib/action_command.rb
CHANGED
@@ -3,6 +3,8 @@ require 'action_command/result'
|
|
3
3
|
require 'action_command/input_output'
|
4
4
|
require 'action_command/executable'
|
5
5
|
require 'action_command/utils'
|
6
|
+
require 'action_command/log_parser'
|
7
|
+
require 'action_command/pretty_print_log_action'
|
6
8
|
|
7
9
|
# To use action command, create subclasses of ActionCommand::Executable
|
8
10
|
# and run them using the ActionCommand.execute_... variants.
|
@@ -18,6 +20,32 @@ module ActionCommand
|
|
18
20
|
# Used as root parent of command if we are executing it from rails (a controller, etc)
|
19
21
|
CONTEXT_RAILS = :rails
|
20
22
|
|
23
|
+
# Used as a root element when the command is executed from an API context
|
24
|
+
CONTEXT_API = :api
|
25
|
+
|
26
|
+
# Used if a result has had no failures
|
27
|
+
RESULT_CODE_OK = 0
|
28
|
+
|
29
|
+
# Used as a generic result code for failure, if you do not provide
|
30
|
+
# a more specific one through {ActionCommand::Result#failed_with_code}
|
31
|
+
RESULT_CODE_FAILED = 1
|
32
|
+
|
33
|
+
# log entry for the input to a commmand
|
34
|
+
LOG_KIND_COMMAND_INPUT = :command_input
|
35
|
+
|
36
|
+
# log entry for the output from a command
|
37
|
+
LOG_KIND_COMMAND_OUTPUT = :command_output
|
38
|
+
|
39
|
+
# info message from within a command
|
40
|
+
LOG_KIND_INFO = :info
|
41
|
+
|
42
|
+
# debug message from within a command
|
43
|
+
LOG_KIND_DEBUG = :debug
|
44
|
+
|
45
|
+
# error message from within a command
|
46
|
+
LOG_KIND_ERROR = :error
|
47
|
+
|
48
|
+
|
21
49
|
# Used to create an optional parameter in describe_io
|
22
50
|
OPTIONAL = { optional: true }.freeze
|
23
51
|
|
@@ -32,7 +60,7 @@ module ActionCommand
|
|
32
60
|
|
33
61
|
# @return a new, valid, empty result.
|
34
62
|
def self.create_result
|
35
|
-
return ActionCommand::Result.new
|
63
|
+
return ActionCommand::Result.new
|
36
64
|
end
|
37
65
|
|
38
66
|
# Execute a command at the root level of a testing context
|
@@ -83,6 +111,15 @@ module ActionCommand
|
|
83
111
|
return ActionCommand.create_and_execute(cls, params, CONTEXT_RAILS, result)
|
84
112
|
end
|
85
113
|
|
114
|
+
# Execute a command at the root level of an api context
|
115
|
+
# @param cls [ActionCommand::Executable] The class of an Executable subclass
|
116
|
+
# @param params [Hash] parameters used by the command.
|
117
|
+
# @return [ActionCommand::Result]
|
118
|
+
def self.execute_api(cls, params = {})
|
119
|
+
result = create_result
|
120
|
+
return ActionCommand.create_and_execute(cls, params, CONTEXT_API, result)
|
121
|
+
end
|
122
|
+
|
86
123
|
# Execute a child command, placing its results under the specified subkey
|
87
124
|
# @param parent [ActionCommand::Executable] An instance of the parent command
|
88
125
|
# @param cls [ActionCommand::Executable] The class of an Executable subclass
|
@@ -92,7 +129,7 @@ module ActionCommand
|
|
92
129
|
# @param params [Hash] parameters used by the command.
|
93
130
|
# @return [ActionCommand::Result]
|
94
131
|
def self.execute_child(parent, cls, result, result_key, params = {})
|
95
|
-
result.push(result_key)
|
132
|
+
result.push(result_key, cls)
|
96
133
|
ActionCommand.create_and_execute(cls, params, parent, result)
|
97
134
|
result.pop(result_key)
|
98
135
|
return result
|
@@ -115,14 +152,24 @@ module ActionCommand
|
|
115
152
|
|
116
153
|
# Used internally, not for general purpose use.
|
117
154
|
def self.create_and_execute(cls, params, parent, result)
|
155
|
+
check_params(cls, params)
|
156
|
+
params[:parent] = parent
|
157
|
+
result.logger = params[:logger]
|
158
|
+
result.logger = @@logger unless params[:logger]
|
159
|
+
result.root_command(cls) if parent.is_a? Symbol
|
160
|
+
action = cls.new(params)
|
161
|
+
|
162
|
+
result.log_input(params)
|
163
|
+
action.execute(result)
|
164
|
+
result.log_output
|
165
|
+
return result
|
166
|
+
end
|
167
|
+
|
168
|
+
def self.check_params(cls, params)
|
118
169
|
raise ArgumentError, 'Expected params to be a Hash' unless params.is_a? Hash
|
119
170
|
|
120
171
|
unless cls.is_a?(Class) && cls.ancestors.include?(ActionCommand::Executable)
|
121
172
|
raise ArgumentError, 'Expected an ActionCommand::Executable as class'
|
122
173
|
end
|
123
|
-
|
124
|
-
params[:parent] = parent
|
125
|
-
action = cls.new(params)
|
126
|
-
return action.execute(result)
|
127
174
|
end
|
128
175
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_command
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Jones
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: byebug
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rake
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,6 +206,34 @@ dependencies:
|
|
192
206
|
- - ">="
|
193
207
|
- !ruby/object:Gem::Version
|
194
208
|
version: '0'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: activerecord
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: 4.0.0
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 4.0.0
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: sqlite3
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - ">="
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - ">="
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '0'
|
195
237
|
description: Simple implementation of command pattern focused on reuse in multiple
|
196
238
|
contexts
|
197
239
|
email:
|
@@ -200,6 +242,7 @@ executables: []
|
|
200
242
|
extensions: []
|
201
243
|
extra_rdoc_files: []
|
202
244
|
files:
|
245
|
+
- ".byebug_history"
|
203
246
|
- ".codeclimate.yml"
|
204
247
|
- ".gitignore"
|
205
248
|
- ".rspec"
|
@@ -236,7 +279,10 @@ files:
|
|
236
279
|
- doc/top-level-namespace.html
|
237
280
|
- lib/action_command.rb
|
238
281
|
- lib/action_command/executable.rb
|
282
|
+
- lib/action_command/executable_transaction.rb
|
239
283
|
- lib/action_command/input_output.rb
|
284
|
+
- lib/action_command/log_parser.rb
|
285
|
+
- lib/action_command/pretty_print_log_action.rb
|
240
286
|
- lib/action_command/result.rb
|
241
287
|
- lib/action_command/utils.rb
|
242
288
|
- lib/action_command/version.rb
|