runfile 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87351dfdba90ed54e90de8659791d79242b993ee
4
- data.tar.gz: d0fea602beebde2f9f47d754ceddcd9961d16bea
3
+ metadata.gz: 558258a98c5a64125802ab9612acd60906bfd069
4
+ data.tar.gz: d787f718632c0e16df8d176938a30a54e668d5c7
5
5
  SHA512:
6
- metadata.gz: 01b40937adcc3301f2afe3143a7f85bae625a19c95a631d7f11774b4aca28328fe9f6dc738eeebc2b6c0dd43e0b13408111721d3eb62e23ea64e0acb782e4096
7
- data.tar.gz: 06d21eab94577ec842795941c335621d198162965e30e2e49b079aebab2fae9ef159a5fd6064e9cbab9e57a3813ada6324fd7f700dcfae5a34f857379621c0e0
6
+ metadata.gz: 01ff19b161a0ab6492e87a5c432b2ca76de79802fa5356fb2103879e4ed67d11494d926f8343260414a3c51b56ae0c665ff7c423ea93377bc93e1519e68d0b84
7
+ data.tar.gz: 46ed488ad6b113c67223240d751a83409a7edb70950845cd1a34dd27133d5145ab74bf032b7a92da9e122658d51f7e8675d01af2e66a9c914713c22f80ab4445
data/lib/runfile/dsl.rb CHANGED
@@ -3,7 +3,6 @@
3
3
  # for handling.
4
4
 
5
5
  module Runfile
6
-
7
6
  # Set the version of your Runfile program
8
7
  def version(ver)
9
8
  Runner.instance.version = ver
@@ -44,4 +43,8 @@ module Runfile
44
43
  def call(command_string)
45
44
  Runner.instance.cross_call command_string
46
45
  end
46
+
47
+ # Also allow to use 'endcommand' instead of 'command' to end
48
+ # a command namespace definition
49
+ alias_method :endcommand, :command
47
50
  end
@@ -1,23 +1,25 @@
1
1
  require 'docopt'
2
+ require 'pp'
2
3
 
3
4
  module Runfile
4
5
 
5
6
  # The Runner class is the main workhorse behind Runfile.
6
7
  # It handles all the Runfile DSL commands and executes the Runfile.
7
8
  class Runner
8
- attr_accessor :last_usage, :last_help, :version, :summary, :namespace
9
+ attr_accessor :last_usage, :last_help, :version, :summary, :namespace, :superspace
9
10
 
10
11
  @@instance = nil
11
12
 
12
13
  # Initialize all variables to sensible defaults.
13
14
  def initialize
14
- @last_usage = nil
15
- @last_help = nil
16
- @namespace = nil
17
- @actions = {}
18
- @options = {}
19
- @version = "0.0.0"
20
- @summary = false
15
+ @last_usage = nil # dsl: usage
16
+ @last_help = nil # dsl: help
17
+ @superspace = nil # used when filename != Runfile
18
+ @namespace = nil # dsl: #command
19
+ @actions = {} # dsl: action
20
+ @options = {} # dsl: option
21
+ @version = "0.0.0" # dsl: version
22
+ @summary = false # dsl: summary
21
23
  end
22
24
 
23
25
  # Return a singleton Runner instance.
@@ -27,9 +29,9 @@ module Runfile
27
29
  end
28
30
 
29
31
  # Load and execute a Runfile call.
30
- def execute(argv)
31
- File.exist? 'Runfile' or handle_no_runfile argv
32
- load 'Runfile'
32
+ def execute(argv, filename='Runfile')
33
+ File.exist? filename or handle_no_runfile argv
34
+ load filename
33
35
  @@instance.run *argv
34
36
  end
35
37
 
@@ -41,6 +43,10 @@ module Runfile
41
43
  name = "#{namespace}_#{name}".to_sym
42
44
  @last_usage = "#{@namespace} #{@last_usage}"
43
45
  end
46
+ if @superspace
47
+ name = "#{superspace}_#{name}".to_sym
48
+ @last_usage = "#{@superspace} #{@last_usage}"
49
+ end
44
50
  @actions[name] = Action.new(block, @last_usage, @last_help)
45
51
  @last_usage = nil
46
52
  @last_help = nil
@@ -55,9 +61,8 @@ module Runfile
55
61
  # generate the docopt document on the fly, using all the
56
62
  # information collected so far.
57
63
  def run(*argv)
58
- action = find_action argv
59
64
  begin
60
- docopt_exec action, argv
65
+ docopt_exec argv
61
66
  rescue Docopt::Exit => e
62
67
  puts e.message
63
68
  end
@@ -68,9 +73,8 @@ module Runfile
68
73
  # it was typed in the command prompt.
69
74
  def cross_call(command_string)
70
75
  argv = command_string.split /\s(?=(?:[^"]|"[^"]*")*$)/
71
- action = find_action argv
72
76
  begin
73
- docopt_exec action, argv
77
+ docopt_exec argv
74
78
  rescue Docopt::Exit => e
75
79
  puts "Cross call failed: #{command_string}"
76
80
  abort e.message
@@ -89,24 +93,23 @@ module Runfile
89
93
  # parsed arguments.
90
94
  # This should always be called in a begin...rescue block and
91
95
  # you should handle the Docopt::Exit exception.
92
- def docopt_exec(action, argv)
96
+ def docopt_exec(argv)
93
97
  args = Docopt::docopt(docopt, version: @version, argv:argv)
98
+ action = find_action argv
94
99
  action or abort "Runfile error: Action not found"
95
100
  @actions[action].execute args
96
101
  end
97
102
 
98
- # Inspect the first two arguments in the argv and look for
99
- # a matching action or command_action.
100
- # We give priority to the second form (:make_jam) in order to
101
- # also allow "overloading" of the command as an action
102
- # (e.g. also allow a global action called :make).
103
+ # Inspect the first three arguments in the argv and look for
104
+ # a matching action.
105
+ # We will first look for a_b_c action, then for a_b and
106
+ # finally for a. This is intended to allow "overloading" of
107
+ # the command as an action (e.g. also allow a global action
108
+ # called 'a').
103
109
  def find_action(argv)
104
- if argv.size >= 2
105
- action = "#{argv[0]}_#{argv[1]}".to_sym
106
- return action if @actions.has_key? action
107
- end
108
- if argv.size >= 1
109
- action = argv[0].to_sym
110
+ 3.downto(1).each do |n|
111
+ next unless argv.size >= n
112
+ action = argv[0..n-1].join('_').to_sym
110
113
  return action if @actions.has_key? action
111
114
  end
112
115
  return false
@@ -115,15 +118,26 @@ module Runfile
115
118
  # Handle the case when `run` is called without a Runfile
116
119
  # present. We will let the user know they can type `run make`
117
120
  # to create a new sample Runfile.
121
+ # If the first argument matches the name of a *.runfile name,
122
+ # we will execute it.
118
123
  def handle_no_runfile(argv)
119
124
  if argv[0] == "make"
120
125
  sample = File.dirname(__FILE__) + "/../../examples/template/Runfile"
121
126
  dest = Dir.pwd + "/Runfile"
122
127
  File.write(dest, File.read(sample))
123
128
  abort "Runfile created."
129
+ elsif argv[0] and File.exist? "#{argv[0]}.runfile"
130
+ @superspace = argv[0]
131
+ execute argv, "#{argv[0]}.runfile"
124
132
  else
125
- abort "Runfile not found.\nUse 'run make' to create one."
133
+ runfiles = Dir['*.runfile']
134
+ runfiles.empty? and abort "Runfile not found.\nUse 'run make' to create one."
135
+ runfiles.each do |f|
136
+ f.slice! '.runfile'
137
+ puts "Did you mean 'run #{f}'"
138
+ end
126
139
  end
140
+ exit
127
141
  end
128
142
  end
129
143
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runfile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit