runfile 0.2.7 → 0.2.8

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: 8cb84d16815dfadc5e82418e78fd206aa620b1db
4
- data.tar.gz: ff736e5bb5457df832e1d86bcc30e0b511c5306a
3
+ metadata.gz: 1df6dc7a19fa65337447fc31211bca292dfe4f51
4
+ data.tar.gz: b18d49b824c571c79b33bdfce4de8d623341f24f
5
5
  SHA512:
6
- metadata.gz: 0e43ff2a0f3abcdad96268ac6a31dab5dad865af382ab083f71e18d3d8e7fb5c4cc8205a5e96909e2758368f9aab747ba0ec8defeda934c1b1bc6aa1a76b7ed5
7
- data.tar.gz: c1d2e5d20e4fe53249bd36ed69805b724d45c3d43d0092505c2a346bb217c0a415b7f352e0440a853ae2211cb5241132950f77f56159d46daeccf06ba2ef387d
6
+ metadata.gz: 98946aa178216ee977540b219285e7adf68afdb5bf73ae36ad1f1af422e1129be2255ebee3eb1f5155021c84354ddd127031facee9b66e89f875ca11f39d7896
7
+ data.tar.gz: 53eb5cdc444911e1587490f042381d5b1e0c3d4153fa4b97b8d8b301008ec58fab05a14b6e28e2bb59e1e41644e9efd8dcbbbdc9202c836f0c04835cef12b251
data/README.md CHANGED
@@ -82,4 +82,3 @@ Options:
82
82
  - [Runfile Command Reference](https://github.com/DannyBen/runfile/wiki/Runfile-Command-Reference)
83
83
  - [Wiki](https://github.com/DannyBen/runfile/wiki)
84
84
  - [Rubydoc](http://www.rubydoc.info/gems/runfile)
85
-
data/lib/runfile.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'runfile/version'
3
- require 'runfile/docopt_maker'
3
+ require 'runfile/docopt_helper'
4
+ require 'runfile/runfile_helper'
4
5
  require 'runfile/action'
5
6
  require 'runfile/runner'
6
7
  require 'runfile/dsl'
@@ -4,9 +4,15 @@ require 'colsole'
4
4
  module Runfile
5
5
  include Colsole
6
6
 
7
- # The DocoptMaker class handles the dynamic generation of the docopt
8
- # document.
9
- class DocoptMaker
7
+ # The DocoptHelper class handles the dynamic generation of the
8
+ # docopt document and the docopt part of the execution (meaning,
9
+ # to call Docopt so it returns the parsed arguments or halts with
10
+ # usage message).
11
+ class DocoptHelper
12
+
13
+ # The constructor expects to get all the textual details
14
+ # needed to generate a docopt document (name, version,
15
+ # summary, options) and an array of Action objects.
10
16
  def initialize(name, version, summary, actions, options)
11
17
  @name = name
12
18
  @version = version
@@ -17,7 +23,7 @@ module Runfile
17
23
 
18
24
  # Generate a document based on all the actions, help messages
19
25
  # and options we have collected from the Runfile DSL.
20
- def make
26
+ def docopt
21
27
  width, height = detect_terminal_size
22
28
  doc = "#{@name} #{@version}\n"
23
29
  doc += "#{@summary} \n" if @summary
@@ -45,5 +51,11 @@ module Runfile
45
51
  end
46
52
  doc
47
53
  end
54
+
55
+ # Calls the docopt handler, which will either return a parsed
56
+ # arguments list, or halt execution and show usage.
57
+ def args(argv)
58
+ Docopt::docopt(docopt, version: @version, argv:argv)
59
+ end
48
60
  end
49
61
  end
@@ -0,0 +1,82 @@
1
+ require 'docopt'
2
+ require 'pp'
3
+
4
+ module Runfile
5
+
6
+ # The RunfileHelper class assists in:
7
+ # 1. Finding named.runfiles
8
+ # 2. Creating new runfiles (`run make`)
9
+ # 3. Showing a list of found system runfiles in a colorful help
10
+ class RunfileHelper
11
+
12
+ # Handle the case when `run` is called without a Runfile
13
+ # present. We will let the user know they can type `run make`
14
+ # to create a new sample Runfile.
15
+ # If the first argument matches the name of a *.runfile name,
16
+ # we will return it to the caller. Otherwise, we return false
17
+ # to indicate "no further handling is needed".
18
+ def handle(argv)
19
+ # make a new runfile
20
+ if argv[0] == "make"
21
+ make_runfile argv[1]
22
+ return false
23
+ end
24
+
25
+ # get a list of *.runfile path-wide
26
+ runfiles = find_runfiles || []
27
+
28
+ # if first arg is a valid *.runfile, run it
29
+ if argv[0]
30
+ runfile = runfiles.select { |f| f[/#{argv[0]}.runfile/] }.first
31
+ runfile and return runfile
32
+ end
33
+
34
+ # if we are here, offer some help and advice
35
+ show_make_help runfiles
36
+ return false
37
+ end
38
+
39
+ private
40
+
41
+ # Create a new runfile in the current directory. We can either
42
+ # create a standard 'Runfile' or a 'named.runfile'.
43
+ def make_runfile(name=nil)
44
+ name = 'Runfile' if name.nil?
45
+ template = File.expand_path("../templates/Runfile", __FILE__)
46
+ name += ".runfile" unless name == 'Runfile'
47
+ dest = "#{Dir.pwd}/#{name}"
48
+ begin
49
+ File.write(dest, File.read(template))
50
+ puts "#{name} created."
51
+ rescue => e
52
+ abort "Failed creating #{name}\n#{e.message}"
53
+ end
54
+ end
55
+
56
+ # Find all *.runfiles path-wide
57
+ def find_runfiles
58
+ find_all_in_path '*.runfile'
59
+ end
60
+
61
+ # Show some helpful tips, and a list of available runfiles
62
+ def show_make_help(runfiles)
63
+ say "!txtpur!Runfile engine v#{Runfile::VERSION}"
64
+ runfiles.size < 5 and say "\nTip: Type '!txtblu!run make!txtrst!' or '!txtblu!run make name!txtrst!' to create a runfile.\n Place !txtblu!named.runfiles!txtrst! anywhere in the PATH for global access."
65
+ if runfiles.empty?
66
+ say "\n!txtred!Runfile not found."
67
+ else
68
+ say ""
69
+ max = runfiles.max_by(&:length).size
70
+ width, height = detect_terminal_size
71
+ runfiles.each do |f|
72
+ f[/([^\/]+).runfile$/]
73
+ command = "run #{$1}"
74
+ spacer_size = width - max - command.size - 6
75
+ spacer_size = [1, spacer_size].max
76
+ spacer = '.' * spacer_size
77
+ say " !txtgrn!#{command}!txtrst! #{spacer} #{f}"
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -4,7 +4,10 @@ require 'pp'
4
4
  module Runfile
5
5
 
6
6
  # The Runner class is the main workhorse behind Runfile.
7
- # It handles all the Runfile DSL commands and executes the Runfile.
7
+ # It handles all the Runfile DSL commands and executes the
8
+ # Runfile with the help of two more specialized classes:
9
+ # 1. DocoptHelper - for deeper docopt related actions
10
+ # 2. RunfileHelper - for Runfile creation and system wide search
8
11
  class Runner
9
12
  attr_accessor :last_usage, :last_help, :name, :version,
10
13
  :summary, :namespace, :superspace
@@ -89,18 +92,13 @@ module Runfile
89
92
 
90
93
  private
91
94
 
92
- # Dynamically generate the docopt document.
93
- def docopt
94
- maker = DocoptMaker.new(@name, @version, @summary, @actions, @options)
95
- maker.make
96
- end
97
-
98
95
  # Call the docopt parser and execute the action with the
99
96
  # parsed arguments.
100
97
  # This should always be called in a begin...rescue block and
101
98
  # you should handle the Docopt::Exit exception.
102
99
  def docopt_exec(argv)
103
- args = Docopt::docopt(docopt, version: @version, argv:argv)
100
+ helper = DocoptHelper.new(@name, @version, @summary, @actions, @options)
101
+ args = helper.args argv
104
102
  action = find_action argv
105
103
  action or abort "Runfile error: Action not found"
106
104
  @actions[action].execute args
@@ -121,61 +119,18 @@ module Runfile
121
119
  return false
122
120
  end
123
121
 
124
- # Handle the case when `run` is called without a Runfile
125
- # present. We will let the user know they can type `run make`
126
- # to create a new sample Runfile.
127
- # If the first argument matches the name of a *.runfile name,
128
- # we will execute it.
122
+ # When `run` is called without a Runfile (or runfile not
123
+ # found), hand over handling to the RunfileHelper class.
124
+ # If will either return false if no further handling is needed
125
+ # on our part, or the name of a runfile to execute.
129
126
  def handle_no_runfile(argv)
130
- # make a new runfile
131
- if argv[0] == "make"
132
- make_runfile argv[1]
133
- exit
134
- end
135
-
136
- # get a list of *.runfile path-wide
137
- runfiles = find_runfiles || []
138
-
139
- # if first arg is a valid *.runfile, run it
140
- if argv[0]
141
- runfile = runfiles.select { |f| f[/#{argv[0]}.runfile/] }.first
142
- if runfile
143
- @superspace = argv[0]
144
- execute argv, runfile
145
- exit
146
- end
147
- end
148
-
149
- # if we are here, offer some help and advice
150
- say "!txtpur!Runfile engine v#{Runfile::VERSION}\n"
151
- runfiles.empty? and say "!txtred!Runfile not found."
152
- runfiles.each do |f|
153
- f[/([^\/]+).runfile$/]
154
- say "Did you mean '!txtgrn!run #{$1}!txtrst!' (#{f})"
127
+ maker = RunfileHelper.new
128
+ runfile = maker.handle argv
129
+ if runfile
130
+ @superspace = argv[0]
131
+ execute argv, runfile
155
132
  end
156
- say "\nUse '!txtblu!run make!txtrst!' to create 'Runfile'.\nUse '!txtblu!run make name!txtrst!' to create 'name.runfile'.\nPlace named.runfiles anywhere in the path for global access.\n"
157
133
  exit
158
-
159
- end
160
-
161
- # Create a new runfile in the current directory. We can either
162
- # create a standard 'Runfile' or a 'named.runfile'.
163
- def make_runfile(name=nil)
164
- name = 'Runfile' if name.nil?
165
- template = File.expand_path("../templates/Runfile", __FILE__)
166
- name += ".runfile" unless name == 'Runfile'
167
- dest = "#{Dir.pwd}/#{name}"
168
- begin
169
- File.write(dest, File.read(template))
170
- puts "#{name} created."
171
- rescue => e
172
- abort "Failed creating #{name}\n#{e.message}"
173
- end
174
- end
175
-
176
- # Find all *.runfiles path-wide
177
- def find_runfiles
178
- find_all_in_path '*.runfile'
179
134
  end
180
135
  end
181
136
  end
@@ -1,9 +1,14 @@
1
- summary "Application description"
1
+ name "Greeter"
2
+ summary "A sample Runfile"
2
3
  version "0.1.0"
3
4
 
4
- usage "command <arg> [--flag]"
5
- help "Help line for command"
6
- option "-f --flag", "Help text for option"
7
- action :command do |args|
8
- say "Command running..."
5
+ usage "hello [<name> --color]"
6
+ help "Say hello"
7
+ option "-c --color", "Greet with color"
8
+ action :hello do |args|
9
+ if args['--color']
10
+ say "!txtgrn!Hello #{args['<name>']}"
11
+ else
12
+ say "Hello #{args['<name>']}"
13
+ end
9
14
  end
@@ -1,3 +1,3 @@
1
1
  module Runfile
2
- VERSION = "0.2.7"
2
+ VERSION = "0.2.8"
3
3
  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.2.7
4
+ version: 0.2.8
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-18 00:00:00.000000000 Z
11
+ date: 2015-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colsole
@@ -49,8 +49,9 @@ files:
49
49
  - bin/run
50
50
  - lib/runfile.rb
51
51
  - lib/runfile/action.rb
52
- - lib/runfile/docopt_maker.rb
52
+ - lib/runfile/docopt_helper.rb
53
53
  - lib/runfile/dsl.rb
54
+ - lib/runfile/runfile_helper.rb
54
55
  - lib/runfile/runner.rb
55
56
  - lib/runfile/templates/Runfile
56
57
  - lib/runfile/util.rb