runfile 0.1.1.pre → 0.1.2
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/lib/runfile/action.rb +6 -0
- data/lib/runfile/docopt_maker.rb +5 -0
- data/lib/runfile/dsl.rb +22 -6
- data/lib/runfile/runner.rb +39 -4
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b145578577cc500e75a76396084f5c708f3ffc19
|
4
|
+
data.tar.gz: d3f5047c705832d2184c8975b0f55dfb7149354e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 075be67037b4a3bb1680f0c90188332a4ca757f6f2672052496551a5bd8b8d763928e68d5ae304395e0f96306f3d7e058f21b6d3d310c706fd57811be589d674
|
7
|
+
data.tar.gz: 64f564a08e4e93deb4ba3ec4afcb371dc7788a68b7c1bf819efd37ff57f2bf4b526f138bac7aae0f89d76c208aabae1deffd841d6bbd45a58217eef52eed45b3
|
data/lib/runfile/action.rb
CHANGED
@@ -1,4 +1,9 @@
|
|
1
1
|
module Runfile
|
2
|
+
|
3
|
+
# The Action class represents a single Runfile action.
|
4
|
+
# This object holds all the information needed to execute it and
|
5
|
+
# show its help text (excluding the options, as they are considered
|
6
|
+
# global throughout the application)
|
2
7
|
class Action
|
3
8
|
attr :usage, :help
|
4
9
|
|
@@ -8,6 +13,7 @@ module Runfile
|
|
8
13
|
@block = block
|
9
14
|
end
|
10
15
|
|
16
|
+
# Call the provided block
|
11
17
|
def execute(args)
|
12
18
|
@block.yield args
|
13
19
|
end
|
data/lib/runfile/docopt_maker.rb
CHANGED
@@ -3,6 +3,9 @@ require 'colsole'
|
|
3
3
|
|
4
4
|
module Runfile
|
5
5
|
include Colsole
|
6
|
+
|
7
|
+
# The DocoptMaker class handles the dynamic generation of the docopt
|
8
|
+
# document.
|
6
9
|
class DocoptMaker
|
7
10
|
def initialize(version, summary, actions, options)
|
8
11
|
@version = version
|
@@ -11,6 +14,8 @@ module Runfile
|
|
11
14
|
@options = options
|
12
15
|
end
|
13
16
|
|
17
|
+
# Generate a document based on all the actions, help messages
|
18
|
+
# and options we have collected from the Runfile DSL.
|
14
19
|
def make
|
15
20
|
width, height = detect_terminal_size
|
16
21
|
doc = "Runfile #{@version}\n"
|
data/lib/runfile/dsl.rb
CHANGED
@@ -1,25 +1,41 @@
|
|
1
|
+
# This file defines all the commands supported in a Runfile.
|
2
|
+
# All commands are immediately handed over to the Runner instance
|
3
|
+
# for handling.
|
4
|
+
|
1
5
|
module Runfile
|
6
|
+
|
7
|
+
# Set the version of your Runfile program
|
2
8
|
def version(ver)
|
3
9
|
Runner.instance.version = ver
|
4
10
|
end
|
5
11
|
|
12
|
+
# Set the one line summary of your Runfile program
|
13
|
+
def summary(text)
|
14
|
+
Runner.instance.summary = text
|
15
|
+
end
|
16
|
+
|
17
|
+
# Set the usage pattern for the next action
|
6
18
|
def usage(text)
|
7
19
|
Runner.instance.last_usage = text
|
8
20
|
end
|
9
21
|
|
22
|
+
# Set the help message for the next action
|
10
23
|
def help(text)
|
11
24
|
Runner.instance.last_help = text
|
12
25
|
end
|
13
26
|
|
14
|
-
|
15
|
-
|
27
|
+
# Add an option/flag to the next action (can be called multiple
|
28
|
+
# times)
|
29
|
+
def option(flag, text)
|
30
|
+
Runner.instance.add_option flag, text
|
16
31
|
end
|
17
32
|
|
18
|
-
|
19
|
-
|
33
|
+
# Define the action
|
34
|
+
def action(name, &block)
|
35
|
+
Runner.instance.add_action name, &block
|
20
36
|
end
|
21
37
|
|
22
|
-
def
|
23
|
-
Runner.instance.
|
38
|
+
def command(name)
|
39
|
+
Runner.instance.namespace = name
|
24
40
|
end
|
25
41
|
end
|
data/lib/runfile/runner.rb
CHANGED
@@ -1,47 +1,64 @@
|
|
1
1
|
require 'docopt'
|
2
2
|
|
3
3
|
module Runfile
|
4
|
+
|
5
|
+
# The Runner class is the main workhorse behind Runfile.
|
6
|
+
# It handles all the Runfile DSL commands and executes the Runfile.
|
4
7
|
class Runner
|
5
|
-
|
8
|
+
attr_accessor :last_usage, :last_help, :version, :summary, :namespace
|
6
9
|
|
7
10
|
@@instance = nil
|
8
11
|
|
12
|
+
# Initialize all variables to a sensible default.
|
9
13
|
def initialize
|
10
14
|
@last_usage = nil
|
11
15
|
@last_help = nil
|
16
|
+
@namespace = nil
|
12
17
|
@actions = {}
|
13
18
|
@options = {}
|
14
19
|
@version = "0.0.0"
|
15
20
|
@summary = false
|
16
21
|
end
|
17
22
|
|
23
|
+
# Return a singleton Runner instance.
|
18
24
|
def self.instance
|
19
25
|
@@instance = self.new if @@instance.nil?
|
20
26
|
@@instance
|
21
27
|
end
|
22
28
|
|
29
|
+
# Load and execute a Runfile call.
|
23
30
|
def execute(argv)
|
24
31
|
File.exist? 'Runfile' or abort "Runfile not found"
|
25
32
|
load 'Runfile'
|
26
33
|
@@instance.run *argv
|
27
34
|
end
|
28
35
|
|
36
|
+
# Add an action to the @actions array, and use the last known
|
37
|
+
# usage and help messages sent by the DSL.
|
29
38
|
def add_action(name, &block)
|
39
|
+
@last_usage = name if @last_usage.nil?
|
40
|
+
if @namespace
|
41
|
+
name = "#{namespace}_#{name}".to_sym
|
42
|
+
@last_usage = "#{@namespace} #{@last_usage}"
|
43
|
+
end
|
30
44
|
@actions[name] = Action.new(block, @last_usage, @last_help)
|
31
45
|
@last_usage = nil
|
32
46
|
@last_help = nil
|
33
47
|
end
|
34
48
|
|
49
|
+
# Add an option flag and its help text.
|
35
50
|
def add_option(flag, text)
|
36
51
|
@options[flag] = text
|
37
52
|
end
|
38
53
|
|
54
|
+
# Run the command. This is a wrapper around docopt. It will
|
55
|
+
# generate the docopt document on the fly, using all the
|
56
|
+
# information collected so far.
|
39
57
|
def run(*argv)
|
40
|
-
action = argv
|
41
|
-
action and action = action.to_sym
|
58
|
+
action = find_action argv
|
42
59
|
begin
|
43
60
|
args = Docopt::docopt(docopt, version: @version, argv:argv)
|
44
|
-
|
61
|
+
action or abort "Runfile error: Action not found"
|
45
62
|
@actions[action].execute args
|
46
63
|
rescue Docopt::Exit => e
|
47
64
|
puts e.message
|
@@ -50,9 +67,27 @@ module Runfile
|
|
50
67
|
|
51
68
|
private
|
52
69
|
|
70
|
+
# Dynamically generate the docopt document.
|
53
71
|
def docopt
|
54
72
|
maker = DocoptMaker.new(@version, @summary, @actions, @options)
|
55
73
|
maker.make
|
56
74
|
end
|
75
|
+
|
76
|
+
# Inspect the first two arguments in the argv and look for
|
77
|
+
# a matching action or command_action.
|
78
|
+
# We give priority to the second form (:make_jam) in order to
|
79
|
+
# also allow "overloading" of the command as an action
|
80
|
+
# (e.g. also allow a global action called :make).
|
81
|
+
def find_action(argv)
|
82
|
+
if argv.size >= 2
|
83
|
+
action = "#{argv[0]}_#{argv[1]}".to_sym
|
84
|
+
return action if @actions.has_key? action
|
85
|
+
end
|
86
|
+
if argv.size >= 1
|
87
|
+
action = argv[0].to_sym
|
88
|
+
return action if @actions.has_key? action
|
89
|
+
end
|
90
|
+
return false
|
91
|
+
end
|
57
92
|
end
|
58
93
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: runfile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colsole
|
@@ -51,7 +51,7 @@ files:
|
|
51
51
|
- lib/runfile/docopt_maker.rb
|
52
52
|
- lib/runfile/dsl.rb
|
53
53
|
- lib/runfile/runner.rb
|
54
|
-
homepage:
|
54
|
+
homepage: https://github.com/DannyBen/runfile
|
55
55
|
licenses:
|
56
56
|
- MIT
|
57
57
|
metadata: {}
|
@@ -66,9 +66,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
66
66
|
version: '0'
|
67
67
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
68
|
requirements:
|
69
|
-
- - "
|
69
|
+
- - ">="
|
70
70
|
- !ruby/object:Gem::Version
|
71
|
-
version:
|
71
|
+
version: '0'
|
72
72
|
requirements: []
|
73
73
|
rubyforge_project:
|
74
74
|
rubygems_version: 2.4.6
|