dramaturg 0.0.1 → 0.1.0
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 +23 -0
- data/README.md +3 -1
- data/dramaturg.gemspec +1 -1
- data/examples/just_print.rb +3 -2
- data/examples/tee_test.rb +11 -0
- data/examples/virtual_env_vars.rb +8 -0
- data/lib/dramaturg/command/as_collection.rb +32 -0
- data/lib/dramaturg/command.rb +34 -15
- data/lib/dramaturg/ctrl_c_handler/skip_or_exit.rb +1 -1
- data/lib/dramaturg/parser.rb +62 -0
- data/lib/dramaturg/prompter/base.rb +25 -13
- data/lib/dramaturg/prompter/madCLIbs.rb +22 -34
- data/lib/dramaturg/prompter/use_defaults.rb +14 -21
- data/lib/dramaturg/runner/base.rb +5 -9
- data/lib/dramaturg/runner/print.rb +2 -4
- data/lib/dramaturg/runner/shell.rb +4 -3
- data/lib/dramaturg/runner/thor.rb +20 -0
- data/lib/dramaturg/runner.rb +1 -0
- data/lib/dramaturg/script.rb +22 -40
- data/lib/dramaturg/thor.rb +14 -0
- data/lib/dramaturg/value/base.rb +31 -0
- data/lib/dramaturg/value/fixed.rb +5 -1
- data/lib/dramaturg/value/masked.rb +24 -0
- data/lib/dramaturg/value/or_default.rb +24 -0
- data/lib/dramaturg/value/silent.rb +17 -0
- data/lib/dramaturg/value/unknown.rb +28 -0
- data/lib/dramaturg/value.rb +4 -1
- data/lib/dramaturg/version.rb +1 -1
- data/lib/dramaturg.rb +38 -7
- metadata +17 -7
- data/lib/dramaturg/command/hash_like.rb +0 -42
- data/lib/dramaturg/command/parser.rb +0 -34
- data/lib/dramaturg/value/default.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7228984c00c124aef4319fb44cf8ec07b67a041a
|
4
|
+
data.tar.gz: ab2fa0c967516db84cde7aa19958f38ff95c6858
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 059a6b0fc54ea306b8a554380bc396d57c60a4f5fd38a95ad28d588c6a70694f0c93790cafa003450535b2a34fd892870af30c5b05bd88c4d6235c35139b0653
|
7
|
+
data.tar.gz: e7d290b0b30af27b1b180080caa9aa9d239aed8d56cb7797c58551e96c38669f742707e60e596954494e84edc8058957be908bedfc05b2467574b48ba0515409
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
## Change Log
|
2
|
+
|
3
|
+
### v0.1.0 (2015/02/17 20:01 +00:00)
|
4
|
+
- [8879ad3](https://github.com/donaldguy/dramaturg/commit/8879ad33ce818fa60f9eb67b05e53d314ea60566) FIX: restore skip as fail semantics (@donaldguy)
|
5
|
+
- [87a1a2a](https://github.com/donaldguy/dramaturg/commit/87a1a2aa5089997e3d3a1e46c2933ccdee120653) REFACTOR: cmd[] only for symbols; consistent to_s (@donaldguy)
|
6
|
+
- [b446c66](https://github.com/donaldguy/dramaturg/commit/b446c66c98ba082860e2e921a32c286a69363ece) Workaround for eager-eval output access (@donaldguy)
|
7
|
+
- [2fcb94d](https://github.com/donaldguy/dramaturg/commit/2fcb94d1c7c8651e9da9eca54e98f26414c91961) Fixes for Thor (@donaldguy)
|
8
|
+
- [36ce457](https://github.com/donaldguy/dramaturg/commit/36ce457155ea878ec27591ebdffef1c4f4382993) Fixed for Skips and Unknown (@donaldguy)
|
9
|
+
- [cbe49f4](https://github.com/donaldguy/dramaturg/commit/cbe49f4ed21915d2d5cf038d252f87200c7397e6) Substantial Refactor of ~All internals (@donaldguy)
|
10
|
+
- [2f086e3](https://github.com/donaldguy/dramaturg/commit/2f086e34ee13f668062dec5a68c72072dfbc3dcc) Allow for masked values ("virtual environment variables") (@donaldguy)
|
11
|
+
- [2bb80d8](https://github.com/donaldguy/dramaturg/commit/2bb80d85246b37aa15d159932205590e0df3c9da) Allow stealth `tee` to a file as cmd#save_to_file (@donaldguy)
|
12
|
+
- [b4b1713](https://github.com/donaldguy/dramaturg/commit/b4b1713c5b36f33c8aac73066dd3ab517a5f8f34) Add thor-compatible runner and import-path (@donaldguy)
|
13
|
+
- [0f7e019](https://github.com/donaldguy/dramaturg/commit/0f7e019934165bf532108703daf56a1e5065c2e2) Allow non-space-delimited overridable fields (@donaldguy)
|
14
|
+
- [a584174](https://github.com/donaldguy/dramaturg/commit/a584174b8ce9d2ebd25eda07fac219bd815b58ef) Move default config to class-level constant (@donaldguy)
|
15
|
+
- [ae24769](https://github.com/donaldguy/dramaturg/commit/ae247696e8366b3bf775a93e57c151d0312630cc) Return self after run for code like (@donaldguy)
|
16
|
+
- [a2ee66e](https://github.com/donaldguy/dramaturg/commit/a2ee66e6a74cf8f4f72fe132050c74e40a066a4e) README badges (@donaldguy)
|
17
|
+
|
18
|
+
### v0.0.1 (2015/02/16 05:23 +00:00)
|
19
|
+
- [da395cb](https://github.com/donaldguy/dramaturg/commit/da395cb5ce793f25ec871b42b8f95a5c7c1f312c) deliver on "optionally" with UseDefault Prompter (@donaldguy)
|
20
|
+
- [2b0e752](https://github.com/donaldguy/dramaturg/commit/2b0e752a2b29c60f946a264a0a6e5ac9ddd67a6a) Add some pluggable int handlers; fancy prompt (@donaldguy)
|
21
|
+
- [b6903cd](https://github.com/donaldguy/dramaturg/commit/b6903cd3a4fb1e7b5fbdb53ae2818d944f1b765c) Provisional Custom Interrupt Handling (@donaldguy)
|
22
|
+
- [33dcec2](https://github.com/donaldguy/dramaturg/commit/33dcec2c0fc3768088eadd2227fac1183f6eec7e) Refactor config interface (@donaldguy)
|
23
|
+
- [b3491e0](https://github.com/donaldguy/dramaturg/commit/b3491e01ee89fd0d7e85d0c9e9b4669ad444a5b7) Working proof of concept (@donaldguy)
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
# Dramaturg: Optionally-interactive shell scripts
|
1
|
+
# Dramaturg: <br>Optionally-interactive shell scripts
|
2
|
+
[](http://badge.fury.io/rb/dramaturg) [](https://codeclimate.com/github/donaldguy/dramaturg) [](https://gemnasium.com/donaldguy/dramaturg)
|
3
|
+
|
2
4
|
|
3
5
|
In theater, a dramaturg (or "literary manager") is a behind-the-scenes individual who researches and advises in the development of dramatic scripts and productions.
|
4
6
|
|
data/dramaturg.gemspec
CHANGED
@@ -25,7 +25,7 @@ easily departed from as desired & appropriate for the user's level of familiarit
|
|
25
25
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
26
26
|
spec.require_paths = ["lib"]
|
27
27
|
|
28
|
-
spec.add_dependency "madCLIbs", '~> 0.0.
|
28
|
+
spec.add_dependency "madCLIbs", '~> 0.0.5'
|
29
29
|
spec.add_dependency "activesupport", '~> 4'
|
30
30
|
|
31
31
|
|
data/examples/just_print.rb
CHANGED
@@ -8,12 +8,13 @@ $i = Dramaturg::Script.new({
|
|
8
8
|
class: Dramaturg::Runner::Print
|
9
9
|
},
|
10
10
|
})
|
11
|
-
at_exit { $i.run_all() }
|
12
11
|
|
13
|
-
git = cmd("git checkout -b {branch:master}")
|
12
|
+
git = $i.cmd("git checkout -b {branch:master}")
|
14
13
|
.name('new branch')
|
15
14
|
.fail_ok(true)
|
16
15
|
|
17
16
|
$i["git push -u origin {#{git[:branch]}}"]
|
18
17
|
|
19
18
|
$i["echo 'all up to date'"]
|
19
|
+
|
20
|
+
$i.run_all
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Dramaturg
|
2
|
+
class Command
|
3
|
+
module AsCollection
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
def each &b
|
7
|
+
@values.each &b
|
8
|
+
end
|
9
|
+
|
10
|
+
def [](i)
|
11
|
+
run unless ran?
|
12
|
+
if self.respond_to? i
|
13
|
+
self.send i
|
14
|
+
else
|
15
|
+
@outputs[i].for_prompt
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def []=(i,v)
|
20
|
+
@outputs[i] = v
|
21
|
+
end
|
22
|
+
|
23
|
+
def <<(v)
|
24
|
+
@values << v
|
25
|
+
end
|
26
|
+
|
27
|
+
def output
|
28
|
+
@outputs[:output]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/dramaturg/command.rb
CHANGED
@@ -1,40 +1,59 @@
|
|
1
|
-
require_relative 'command/
|
2
|
-
require_relative 'command/parser'
|
1
|
+
require_relative 'command/as_collection'
|
3
2
|
require_relative 'command/opt'
|
4
3
|
|
5
4
|
module Dramaturg
|
6
5
|
class Command
|
7
|
-
include Command::
|
8
|
-
include Command::Parser
|
6
|
+
include Command::AsCollection
|
9
7
|
include Command::Opt
|
10
8
|
|
11
|
-
opt :name,
|
12
|
-
opt :program_name, ->(cmd){cmd.to_s[/^\S+/]}
|
13
|
-
opt :aborted, false
|
9
|
+
opt :name, ->(cmd) { cmd.to_s[/^[^\{]+/].strip }
|
10
|
+
opt :program_name, ->(cmd) { cmd.to_s[/^\S+/] }
|
14
11
|
|
12
|
+
#prompt behavior
|
15
13
|
opt :allow_suffix, ->(cmd){!!(cmd.to_s =~ /\s+$/)}
|
16
|
-
|
14
|
+
|
15
|
+
#run behavior
|
17
16
|
opt :fail_ok, false
|
18
17
|
|
19
|
-
|
20
|
-
|
18
|
+
#output direction
|
19
|
+
opt :capture_output, false
|
20
|
+
opt :save_to_file, false
|
21
21
|
|
22
22
|
def initialize(cmd_str, script)
|
23
|
-
@
|
23
|
+
@input_string = cmd_str
|
24
24
|
@script = script
|
25
|
-
@
|
25
|
+
@values = []
|
26
|
+
@outputs = {}
|
26
27
|
end
|
27
28
|
|
28
29
|
def run
|
29
30
|
@script.execute(self)
|
31
|
+
self
|
32
|
+
end
|
33
|
+
attr_accessor :ran
|
34
|
+
def ran?
|
35
|
+
@ran ||= false
|
36
|
+
@ran || @skipped
|
30
37
|
end
|
31
38
|
|
32
|
-
def
|
33
|
-
|
39
|
+
def skip
|
40
|
+
@ok = :skipped
|
41
|
+
@skipped = true
|
42
|
+
@outputs.each {|k,_| @outputs[k] = Value::Unknown.new() }
|
34
43
|
end
|
44
|
+
def skipped?; @skipped ||= false; end
|
45
|
+
|
46
|
+
attr_accessor :ok
|
47
|
+
alias ok? ok
|
48
|
+
alias success? ok
|
49
|
+
alias succeeded? ok
|
35
50
|
|
36
51
|
def to_s
|
37
|
-
@
|
52
|
+
if @values.empty?
|
53
|
+
@input_string
|
54
|
+
else
|
55
|
+
self.map {|t| t.to_s}.join ''
|
56
|
+
end
|
38
57
|
end
|
39
58
|
end
|
40
59
|
end
|
@@ -2,7 +2,7 @@ module Dramaturg
|
|
2
2
|
class CtrlCHandler
|
3
3
|
class SkipOrExit
|
4
4
|
def self.call(prompter, cmd)
|
5
|
-
puts "\n^C again to exit;
|
5
|
+
puts "\n^C again to exit; Any other key to skip '#{cmd.name}'"
|
6
6
|
|
7
7
|
require 'mad_clibs/util/iohelper'
|
8
8
|
key = IOHelper.read_key(false)
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Dramaturg
|
2
|
+
class Parser
|
3
|
+
class <<self
|
4
|
+
def call(cmd)
|
5
|
+
tokens = tokenize(cmd.to_s)
|
6
|
+
|
7
|
+
tokens.each do |t|
|
8
|
+
case t
|
9
|
+
when /^\{(\w+):(.+)\}$/
|
10
|
+
add_named_value(cmd, $1.to_sym, $2)
|
11
|
+
when /^\{([^\$].*)\}$/
|
12
|
+
add_anon_value(cmd, $1)
|
13
|
+
when /^\{(\$.+)\}/
|
14
|
+
add_var_value(cmd, $1)
|
15
|
+
else
|
16
|
+
cmd << Value::Fixed.new(t)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
if cmd.allow_suffix
|
21
|
+
suffix = Value::OrDefault.new("")
|
22
|
+
cmd[:_suffix] = suffix
|
23
|
+
cmd << suffix
|
24
|
+
end
|
25
|
+
|
26
|
+
if cmd.save_to_file
|
27
|
+
cmd << Value::Silent.new(" | tee #{cmd.save_to_file}")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def tokenize(s)
|
33
|
+
s.split /(?=\{)|(?<=\})/
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_anon_value(cmd, expression)
|
37
|
+
cmd << Value::OrDefault.new(expression)
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_named_value(cmd, name, value)
|
41
|
+
value = Value::OrDefault.new(value)
|
42
|
+
cmd[name] = value
|
43
|
+
cmd << value
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_var_value(cmd, var)
|
47
|
+
exists = eval("defined? #{var}")
|
48
|
+
key = var.to_sym
|
49
|
+
|
50
|
+
if exists == 'global-variable'
|
51
|
+
value = eval(var)
|
52
|
+
value = Value::Fixed(value) unless value.is_a? Value::Base
|
53
|
+
value.display = var if value.respond_to? :display=
|
54
|
+
|
55
|
+
cmd << value
|
56
|
+
else
|
57
|
+
$stderr.puts "WARN: Reference to undefined global #{$1} at #{caller(7).join("\n\t")}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -1,34 +1,46 @@
|
|
1
1
|
module Dramaturg
|
2
2
|
module Prompter
|
3
3
|
class Base
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :script
|
5
5
|
|
6
6
|
def initialize(script,config)
|
7
7
|
@script = script
|
8
8
|
@prompt = config[:prompt]
|
9
9
|
@formatters = config[:format]
|
10
|
-
@current_command = nil
|
11
|
-
@abort = false
|
12
|
-
end
|
13
10
|
|
14
|
-
|
15
|
-
if @prompt.respond_to? :call
|
16
|
-
@prompt.()
|
17
|
-
else
|
18
|
-
@prompt
|
19
|
-
end
|
11
|
+
@current_command = nil
|
20
12
|
end
|
21
13
|
|
22
14
|
def call(cmd)
|
23
15
|
@current_command = cmd
|
24
|
-
|
16
|
+
value_map = prepare_values(cmd)
|
17
|
+
display = format_for_display(value_map)
|
18
|
+
|
19
|
+
results = doIO(display, value_map)
|
20
|
+
|
21
|
+
process_results(results, value_map)
|
25
22
|
end
|
26
23
|
|
27
24
|
def abort!
|
28
|
-
@
|
29
|
-
self.current_command.aborted(true)
|
25
|
+
@current_command.skip
|
30
26
|
return false
|
31
27
|
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def prompt_for_display
|
31
|
+
if @prompt.respond_to? :call
|
32
|
+
@prompt.(self)
|
33
|
+
else
|
34
|
+
@prompt
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def prepare_values(cmd, debug=false)
|
39
|
+
cmd.map do |v|
|
40
|
+
str = debug ? v.for_debug_prompt : v.for_prompt
|
41
|
+
[v, tr_method_map[v].(str)]
|
42
|
+
end.to_h
|
43
|
+
end
|
32
44
|
end
|
33
45
|
end
|
34
46
|
end
|
@@ -4,52 +4,40 @@ require 'madCLIbs'
|
|
4
4
|
module Dramaturg
|
5
5
|
module Prompter
|
6
6
|
class MadCLIbs < Base
|
7
|
+
attr_reader :current_command
|
8
|
+
|
7
9
|
def initialize(script,config)
|
8
10
|
super
|
9
|
-
@cli = ::MadCLIbs.new
|
11
|
+
@cli = ::MadCLIbs.new(separator: '')
|
10
12
|
@cli.interrupt_handler = ->() { config[:ctrlc].(self, self.current_command) }
|
11
13
|
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
private
|
16
|
+
def tr_method_map
|
17
|
+
proc do |v|
|
18
|
+
if v.kind_of? Value::OrDefault
|
19
|
+
@cli.method :string
|
20
|
+
else
|
21
|
+
String.method :new
|
22
|
+
end
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
}
|
31
|
-
@type_map[t]
|
26
|
+
def format_for_display(map)
|
27
|
+
([prompt_for_display] +
|
28
|
+
map.map do |k,v|
|
29
|
+
@formatters[k.class].(v)
|
30
|
+
end
|
31
|
+
)
|
32
32
|
end
|
33
33
|
|
34
|
-
def
|
35
|
-
|
36
|
-
@reverse_type_map ||= Hash[@type_map.to_a.map(&:reverse)]
|
37
|
-
@reverse_type_map[t]
|
34
|
+
def doIO(display, map)
|
35
|
+
@cli.prompt(*display)
|
38
36
|
end
|
39
37
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
unfmt = cmd.map do |value|
|
44
|
-
if value.is_a? Symbol
|
45
|
-
@values[value] = @cli.string(cmd.default(value))
|
46
|
-
else
|
47
|
-
value
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
unfmt.map do |v|
|
52
|
-
@formatters[token_type_to_value_type(v.class)].(v)
|
38
|
+
def process_results(results, map)
|
39
|
+
map.each do |dmt_v, mcli_t|
|
40
|
+
dmt_v.input(mcli_t.to_s) if dmt_v.respond_to? :input
|
53
41
|
end
|
54
42
|
end
|
55
43
|
end
|
@@ -7,31 +7,24 @@ module Dramaturg
|
|
7
7
|
super
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
return if @abort
|
14
|
-
|
15
|
-
@values.each do |key,value|
|
16
|
-
cmd[key] = cmd.get(cmd.default(key))
|
17
|
-
end
|
10
|
+
private
|
11
|
+
def tr_method_map
|
12
|
+
proc {|s| Kernel.method :String }
|
18
13
|
end
|
19
14
|
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
def format_for_display(map)
|
16
|
+
prompt_for_display +
|
17
|
+
map.map do |k,v|
|
18
|
+
@formatters[k.class].(v)
|
19
|
+
end.join('')
|
20
|
+
end
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
else
|
28
|
-
value
|
29
|
-
end
|
30
|
-
end
|
22
|
+
def doIO(display,map)
|
23
|
+
puts display
|
24
|
+
end
|
31
25
|
|
32
|
-
|
33
|
-
|
34
|
-
end
|
26
|
+
def process_results(*args)
|
27
|
+
#no input
|
35
28
|
end
|
36
29
|
end
|
37
30
|
end
|
@@ -6,22 +6,18 @@ module Dramaturg
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def call(cmd)
|
9
|
-
|
10
|
-
line = cmd.map { |v|
|
11
|
-
|
12
|
-
ok = _call(line, cmd)
|
9
|
+
unless cmd.skipped?
|
10
|
+
line = cmd.map { |v| v.for_run }.join('')
|
13
11
|
|
14
12
|
cmd.ran = line
|
13
|
+
_call(line, cmd)
|
15
14
|
|
16
|
-
if !ok && !cmd.fail_ok
|
15
|
+
if !cmd.ok? && !cmd.fail_ok
|
17
16
|
handle_fail(cmd)
|
18
17
|
end
|
19
|
-
else
|
20
|
-
cmd.ran = :aborted
|
21
|
-
ok = false
|
22
18
|
end
|
23
19
|
|
24
|
-
@last_success =
|
20
|
+
@last_success = (cmd.success? && !cmd.skipped?)
|
25
21
|
end
|
26
22
|
|
27
23
|
def last_success?
|
@@ -8,10 +8,11 @@ module Dramaturg
|
|
8
8
|
|
9
9
|
def _call(line,cmd)
|
10
10
|
if cmd.capture_output
|
11
|
-
|
12
|
-
|
11
|
+
output = `#{line}`
|
12
|
+
cmd[:output] = output
|
13
|
+
cmd.ok = !output.empty?
|
13
14
|
else
|
14
|
-
ok = system(line)
|
15
|
+
cmd.ok = system(line)
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Dramaturg
|
4
|
+
class Runner::Thor < Runner::Base
|
5
|
+
def initialize(script, config={})
|
6
|
+
super
|
7
|
+
@thor_actions = config[:thor_actions]
|
8
|
+
end
|
9
|
+
|
10
|
+
def _call(line,cmd)
|
11
|
+
if cmd.capture_output
|
12
|
+
output = @thor_actions.run(line, verbose: false, capture: true)
|
13
|
+
cmd[:output] = output
|
14
|
+
cmd.ok = !output.empty?
|
15
|
+
else
|
16
|
+
cmd.ok = @thor_actions.run(line, verbose:false)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/dramaturg/runner.rb
CHANGED
data/lib/dramaturg/script.rb
CHANGED
@@ -1,33 +1,7 @@
|
|
1
|
-
require 'term/ansicolor'
|
2
|
-
|
3
|
-
|
4
1
|
module Dramaturg
|
5
2
|
class Script
|
6
|
-
include Term::ANSIColor
|
7
|
-
|
8
3
|
def initialize(config = {})
|
9
|
-
|
10
|
-
prompter: {
|
11
|
-
class: Prompter::MadCLIbs,
|
12
|
-
prompt: ->() {
|
13
|
-
if self.runner.last_success?
|
14
|
-
bold(green("$"))
|
15
|
-
else
|
16
|
-
bold(red("$"))
|
17
|
-
end
|
18
|
-
},
|
19
|
-
format: {
|
20
|
-
Value::Default => ->(s){ bold(cyan(s)) },
|
21
|
-
Value::Fixed => -> (s) { s }
|
22
|
-
},
|
23
|
-
ctrlc: CtrlCHandler::SkipOrExit
|
24
|
-
},
|
25
|
-
runner: {
|
26
|
-
class: Runner::Shell
|
27
|
-
},
|
28
|
-
}
|
29
|
-
|
30
|
-
@config = defaults.deep_merge(config)
|
4
|
+
@config = Dramaturg::DEFAULT_CONFIG.deep_merge(config)
|
31
5
|
|
32
6
|
@commands = []
|
33
7
|
end
|
@@ -46,22 +20,12 @@ module Dramaturg
|
|
46
20
|
alias call cmd
|
47
21
|
alias [] cmd
|
48
22
|
|
49
|
-
def
|
50
|
-
|
51
|
-
self,
|
52
|
-
@config[:prompter]
|
53
|
-
)
|
54
|
-
end
|
55
|
-
|
56
|
-
def runner
|
57
|
-
@runner ||= @config[:runner][:class].new(
|
58
|
-
self,
|
59
|
-
@config[:runner]
|
60
|
-
)
|
23
|
+
def masked_value(str)
|
24
|
+
Value::Masked.new(str)
|
61
25
|
end
|
62
26
|
|
63
27
|
def execute(cmd)
|
64
|
-
cmd
|
28
|
+
parser.(cmd)
|
65
29
|
prompter.(cmd)
|
66
30
|
runner.(cmd)
|
67
31
|
end
|
@@ -73,5 +37,23 @@ module Dramaturg
|
|
73
37
|
end
|
74
38
|
end
|
75
39
|
end
|
40
|
+
|
41
|
+
def parser
|
42
|
+
@config[:parser][:class]
|
43
|
+
end
|
44
|
+
|
45
|
+
def prompter
|
46
|
+
@prompter ||= @config[:prompter][:class].new(
|
47
|
+
self,
|
48
|
+
@config[:prompter]
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
def runner
|
53
|
+
@runner ||= @config[:runner][:class].new(
|
54
|
+
self,
|
55
|
+
@config[:runner]
|
56
|
+
)
|
57
|
+
end
|
76
58
|
end
|
77
59
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'dramaturg'
|
2
|
+
|
3
|
+
module Dramaturg
|
4
|
+
def self.Thor(thor_actions_object, config = {})
|
5
|
+
config = ({
|
6
|
+
runner: {
|
7
|
+
class: Dramaturg::Runner::Thor,
|
8
|
+
thor_actions: thor_actions_object
|
9
|
+
}
|
10
|
+
}).deep_merge(config)
|
11
|
+
|
12
|
+
Dramaturg::Script.new(config)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Dramaturg
|
2
|
+
module Value
|
3
|
+
class Base
|
4
|
+
def initialize(value)
|
5
|
+
@value = value
|
6
|
+
end
|
7
|
+
|
8
|
+
def for_prompt
|
9
|
+
@value
|
10
|
+
end
|
11
|
+
|
12
|
+
def for_debug_prompt
|
13
|
+
@value
|
14
|
+
end
|
15
|
+
|
16
|
+
def for_run
|
17
|
+
@value
|
18
|
+
end
|
19
|
+
|
20
|
+
#for tokens which accept input add a
|
21
|
+
#def input(i)
|
22
|
+
# # modify state
|
23
|
+
#end
|
24
|
+
|
25
|
+
# should match parser input
|
26
|
+
def to_s
|
27
|
+
for_prompt
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Dramaturg
|
4
|
+
class Value::Masked < Value::Base
|
5
|
+
attr_writer :display
|
6
|
+
|
7
|
+
def initialize(value)
|
8
|
+
@display = '$SECRET'
|
9
|
+
super(value)
|
10
|
+
end
|
11
|
+
|
12
|
+
def for_prompt
|
13
|
+
@display
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"{#@display}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def inspect
|
21
|
+
"{#@display = #@value}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module Dramaturg
|
4
|
+
module Value
|
5
|
+
class OrDefault < Base
|
6
|
+
def initialize(value)
|
7
|
+
@default = value
|
8
|
+
super(value)
|
9
|
+
end
|
10
|
+
|
11
|
+
def input(i)
|
12
|
+
@value = i
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"{#@value}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
"{#@value (default: #@dfault)}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'or_default'
|
2
|
+
|
3
|
+
module Dramaturg
|
4
|
+
module Value
|
5
|
+
class Unknown < OrDefault
|
6
|
+
def initialize()
|
7
|
+
super(nil)
|
8
|
+
end
|
9
|
+
|
10
|
+
def for_prompt
|
11
|
+
'???'
|
12
|
+
end
|
13
|
+
|
14
|
+
def for_run
|
15
|
+
if @value == nil
|
16
|
+
raise ArgumentError, "You must set a value"
|
17
|
+
else
|
18
|
+
@value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
"{{unknown}}"
|
24
|
+
end
|
25
|
+
alias inspect to_s
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/dramaturg/value.rb
CHANGED
data/lib/dramaturg/version.rb
CHANGED
data/lib/dramaturg.rb
CHANGED
@@ -1,13 +1,44 @@
|
|
1
|
-
require 'dramaturg/version'
|
2
1
|
require 'active_support/dependencies/autoload'
|
3
2
|
require 'active_support/core_ext/hash/deep_merge'
|
3
|
+
require 'term/ansicolor'
|
4
4
|
|
5
5
|
module Dramaturg
|
6
6
|
extend ActiveSupport::Autoload
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
autoload :Parser
|
8
|
+
autoload :Script
|
9
|
+
autoload :Command
|
10
|
+
autoload :Value
|
11
|
+
autoload :Prompter
|
12
|
+
autoload :Runner
|
13
|
+
autoload :CtrlCHandler
|
14
|
+
|
15
|
+
COLORS = Term::ANSIColor
|
16
|
+
|
17
|
+
|
18
|
+
DEFAULT_CONFIG = {
|
19
|
+
parser: {
|
20
|
+
class: Parser
|
21
|
+
},
|
22
|
+
prompter: {
|
23
|
+
class: Prompter::MadCLIbs,
|
24
|
+
prompt: ->(p) {
|
25
|
+
if p.script.runner.last_success?
|
26
|
+
COLORS.bold(COLORS.green("$ "))
|
27
|
+
else
|
28
|
+
COLORS.bold(COLORS.red("$ "))
|
29
|
+
end
|
30
|
+
},
|
31
|
+
format: (proc do |t|
|
32
|
+
if t <= Value::OrDefault
|
33
|
+
->(s) { COLORS.bold(COLORS.cyan(s)) }
|
34
|
+
else
|
35
|
+
->(s) { s }
|
36
|
+
end
|
37
|
+
end),
|
38
|
+
ctrlc: CtrlCHandler::SkipOrExit
|
39
|
+
},
|
40
|
+
runner: {
|
41
|
+
class: Runner::Shell
|
42
|
+
}
|
43
|
+
}
|
13
44
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dramaturg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Donald Guy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: madCLIbs
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.
|
19
|
+
version: 0.0.5
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.
|
26
|
+
version: 0.0.5
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -68,6 +68,7 @@ extensions: []
|
|
68
68
|
extra_rdoc_files: []
|
69
69
|
files:
|
70
70
|
- ".gitignore"
|
71
|
+
- CHANGELOG.md
|
71
72
|
- Gemfile
|
72
73
|
- LICENSE.txt
|
73
74
|
- README.md
|
@@ -75,14 +76,16 @@ files:
|
|
75
76
|
- dramaturg.gemspec
|
76
77
|
- examples/git_feature_branch.rb
|
77
78
|
- examples/just_print.rb
|
79
|
+
- examples/tee_test.rb
|
80
|
+
- examples/virtual_env_vars.rb
|
78
81
|
- lib/dramaturg.rb
|
79
82
|
- lib/dramaturg/command.rb
|
80
|
-
- lib/dramaturg/command/
|
83
|
+
- lib/dramaturg/command/as_collection.rb
|
81
84
|
- lib/dramaturg/command/opt.rb
|
82
|
-
- lib/dramaturg/command/parser.rb
|
83
85
|
- lib/dramaturg/ctrl_c_handler.rb
|
84
86
|
- lib/dramaturg/ctrl_c_handler/skip.rb
|
85
87
|
- lib/dramaturg/ctrl_c_handler/skip_or_exit.rb
|
88
|
+
- lib/dramaturg/parser.rb
|
86
89
|
- lib/dramaturg/prompter.rb
|
87
90
|
- lib/dramaturg/prompter/base.rb
|
88
91
|
- lib/dramaturg/prompter/madCLIbs.rb
|
@@ -91,10 +94,16 @@ files:
|
|
91
94
|
- lib/dramaturg/runner/base.rb
|
92
95
|
- lib/dramaturg/runner/print.rb
|
93
96
|
- lib/dramaturg/runner/shell.rb
|
97
|
+
- lib/dramaturg/runner/thor.rb
|
94
98
|
- lib/dramaturg/script.rb
|
99
|
+
- lib/dramaturg/thor.rb
|
95
100
|
- lib/dramaturg/value.rb
|
96
|
-
- lib/dramaturg/value/
|
101
|
+
- lib/dramaturg/value/base.rb
|
97
102
|
- lib/dramaturg/value/fixed.rb
|
103
|
+
- lib/dramaturg/value/masked.rb
|
104
|
+
- lib/dramaturg/value/or_default.rb
|
105
|
+
- lib/dramaturg/value/silent.rb
|
106
|
+
- lib/dramaturg/value/unknown.rb
|
98
107
|
- lib/dramaturg/version.rb
|
99
108
|
homepage: https://github.com/donaldguy/dramaturg
|
100
109
|
licenses:
|
@@ -121,3 +130,4 @@ signing_key:
|
|
121
130
|
specification_version: 4
|
122
131
|
summary: A framework for optionally-interactive shell scripts
|
123
132
|
test_files: []
|
133
|
+
has_rdoc:
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Dramaturg
|
2
|
-
class Command
|
3
|
-
module HashLike
|
4
|
-
include Enumerable
|
5
|
-
|
6
|
-
#as part of the interface allowing eager evaluation.
|
7
|
-
#for internal/pre- or mid-run use, use #get
|
8
|
-
def [](k)
|
9
|
-
self.run if !ran?
|
10
|
-
|
11
|
-
if ran? == :aborted
|
12
|
-
"???" #all bets off
|
13
|
-
else
|
14
|
-
get(k)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def get(k)
|
19
|
-
@values ||= {}
|
20
|
-
if k.is_a? Symbol
|
21
|
-
@values[k]
|
22
|
-
elsif k.respond_to? :to_str
|
23
|
-
k.to_str
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def []=(k,v)
|
28
|
-
@values ||= {}
|
29
|
-
@values[k] = v
|
30
|
-
end
|
31
|
-
|
32
|
-
def <<(v)
|
33
|
-
@line ||= []
|
34
|
-
@line << v
|
35
|
-
end
|
36
|
-
|
37
|
-
def each &b
|
38
|
-
@line.each &b
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module Dramaturg
|
2
|
-
class Command
|
3
|
-
module Parser
|
4
|
-
def parse!
|
5
|
-
tokens = tokenize(self.to_s)
|
6
|
-
|
7
|
-
tokens.each do |t|
|
8
|
-
case t
|
9
|
-
when /^\{(\w+):(.+)\}$/
|
10
|
-
key = $1.to_sym
|
11
|
-
self[key] = Value::Default.new($2)
|
12
|
-
self << key
|
13
|
-
when /^\{(.+)\}$/
|
14
|
-
key = $1.to_sym
|
15
|
-
self[key] = Value::Default.new($1)
|
16
|
-
self << key
|
17
|
-
else
|
18
|
-
self << Value::Fixed.new(t)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
if self.allow_suffix
|
23
|
-
self[:__suffix] = Value::Default.new("")
|
24
|
-
self << :__suffix
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
def tokenize(s)
|
30
|
-
s.split /\s+/
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|