go_script 0.0.0 → 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/README.md +40 -19
- data/bin/go-script-template +23 -12
- data/lib/go_script.rb +0 -1
- data/lib/go_script/command_group.rb +61 -13
- data/lib/go_script/go.rb +22 -7
- data/lib/go_script/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f496bded6c9673222755b3041dba2248c74a1b8f
|
4
|
+
data.tar.gz: f9181e7c59e91011b17a3d05b4ea241f254a0a0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c69760ad3ab8269f1f61204e9291d275b4cd07f737d3962f77e5f193bfd570d093d5dcbfb509d64520c31a2c9f5b1b19d7d87fbab6c6d562f869721a1e2f717
|
7
|
+
data.tar.gz: cc918316e22269bca1e7a1a527464999bad3a6fafda21cd50eeaeddabcb0fddb9e92b05acf80cd8bb18c6a7fa468ae8893e4095483a4a33bcbaa34494b56d267
|
data/README.md
CHANGED
@@ -20,20 +20,20 @@ language](https://golang.org). This convention is completely unrelated,
|
|
20
20
|
though it does bear a great deal of resemblance to the Go language's `go`
|
21
21
|
command.
|
22
22
|
|
23
|
-
###
|
23
|
+
### Everyone: install Ruby
|
24
24
|
|
25
25
|
Install [the Ruby programming language](https://www.ruby-lang.org/) if it
|
26
26
|
isn't already present on your system. We recommend using a Ruby version
|
27
27
|
manager such as [rbenv](https://github.com/sstephenson/rbenv) or
|
28
28
|
[rvm](https://rvm.io/) to do this.
|
29
29
|
|
30
|
-
|
30
|
+
### Project authors: creating a `./go` script
|
31
31
|
|
32
|
-
|
33
|
-
wish to add it to the [`Gemfile`](http://bundler.io/gemfile.html) of your
|
34
|
-
project to ensure version consistency.
|
32
|
+
Install the `go_script` gem via `gem install go_script`.
|
35
33
|
|
36
|
-
|
34
|
+
To ensure version consistency for all developers, install
|
35
|
+
[Bundler](http://bundler.io/) via `gem install bundler` and add `gem
|
36
|
+
'go_script'` to your project's [`Gemfile`](http://bundler.io/gemfile.html).
|
37
37
|
|
38
38
|
To create a fresh new `./go` script for your project, run:
|
39
39
|
|
@@ -49,6 +49,17 @@ $ bundle exec go-script-template > ./go
|
|
49
49
|
$ chmod 700 ./go
|
50
50
|
```
|
51
51
|
|
52
|
+
As a bonus, if the project only needs to initialize itself by installing Ruby
|
53
|
+
gems from a `Gemfile`, there is no need to define an `init` command. The
|
54
|
+
`./go` script will automatically install Bundler and run `bundle install`.
|
55
|
+
|
56
|
+
### Project contributors: bootstrapping
|
57
|
+
|
58
|
+
If the project already has a `./go` script, you do not need to install
|
59
|
+
anything first other than Ruby. Just run the `./go` script. It will
|
60
|
+
automatically install the `go_script` gem, either via Bundler (if a `Gemfile`
|
61
|
+
is present) or directly using `gem install`.
|
62
|
+
|
52
63
|
### Listing commands
|
53
64
|
|
54
65
|
To see the list of available commands for a script: run `./go help` (or one of
|
@@ -63,9 +74,7 @@ options:
|
|
63
74
|
-v,--version Show the version of the go_script gem
|
64
75
|
|
65
76
|
Development commands
|
66
|
-
init Set up the development environment
|
67
77
|
update_gems Update Ruby gems
|
68
|
-
update_js Update JavaScript components
|
69
78
|
test Execute automated tests
|
70
79
|
lint Run style-checking tools
|
71
80
|
ci_build Execute continuous integration build
|
@@ -80,7 +89,6 @@ comprise the `./go` script interface. Its arguments are:
|
|
80
89
|
- *id*: A [Ruby symbol](http://ruby-doc.org/core-2.2.3/Symbol.html)
|
81
90
|
(basically, a string starting with `:` with no quotes around it) defining
|
82
91
|
the name of the command.
|
83
|
-
- *command_group*: A `CommandGroup` instance associated with the command.
|
84
92
|
- *description*: A very brief description of the command that appears in the
|
85
93
|
usage text.
|
86
94
|
|
@@ -90,13 +98,27 @@ directives from [`lib/go_script/go.rb`](lib/go_script/go.rb) that may be used
|
|
90
98
|
to define commands, and commands may be built up from other commands defined
|
91
99
|
in the `./go` script itself.
|
92
100
|
|
101
|
+
**Note:** Command names must be unique. Defining a command with a name already
|
102
|
+
used elsewhere will cause the `./go` script to exit with an error message.
|
103
|
+
|
93
104
|
#### Command groups
|
94
105
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
106
|
+
Each `command_group` invocation marks the beginning of a set of related
|
107
|
+
commands. These groupings organize how commands are displayed in the
|
108
|
+
help/usage message.
|
109
|
+
|
110
|
+
`go-script-template` generates a default `command_group` called `:dev`. You
|
111
|
+
are free to edit this definition, or to add additional `command_group`
|
112
|
+
definitions.
|
113
|
+
|
114
|
+
**Note:** Command group names must be unique, and command groups cannot be
|
115
|
+
re-opened after their initial definition. Defining a command group with a name
|
116
|
+
already used elsewhere will cause the `./go` script to exit with an error
|
117
|
+
message.
|
118
|
+
|
119
|
+
Also, command names must be unique across all command groups. Defining a
|
120
|
+
command with the same name as that in another command group will also cause
|
121
|
+
the `./go` script to exit with an error message.
|
100
122
|
|
101
123
|
#### Command arguments
|
102
124
|
|
@@ -104,18 +126,17 @@ Commands may take command-line arguments, which are passed in as block
|
|
104
126
|
variables. In the following example, the `./go init` command takes no
|
105
127
|
arguments, and the `./go test` command takes an argument list that is appended
|
106
128
|
as additional command line arguments to `rake test`. For example, `./go test`
|
107
|
-
runs `bundle exec
|
129
|
+
runs `bundle exec rake test` without any further arguments, while running
|
108
130
|
`./go test TEST=_test/go_test.rb` ultimately runs `bundle exec rake test
|
109
131
|
TEST=_test/go_test.rb`.
|
110
132
|
|
111
133
|
```ruby
|
112
|
-
|
134
|
+
command_group :dev, 'Development commands'
|
113
135
|
|
114
|
-
def_command :init,
|
115
|
-
install_bundle
|
136
|
+
def_command :init, 'Set up the development environment' do
|
116
137
|
end
|
117
138
|
|
118
|
-
def_command :test,
|
139
|
+
def_command :test, 'Execute automated tests' do |args = []|
|
119
140
|
exec_cmd "bundle exec rake test #{args.join ' '}"
|
120
141
|
end
|
121
142
|
```
|
data/bin/go-script-template
CHANGED
@@ -8,37 +8,48 @@ puts <<END_OF_TEMPLATE
|
|
8
8
|
|
9
9
|
require 'English'
|
10
10
|
|
11
|
+
Dir.chdir File.dirname(__FILE__)
|
12
|
+
|
13
|
+
def try_command_and_restart(command)
|
14
|
+
exit $CHILD_STATUS.exitstatus unless system command
|
15
|
+
exec $PROGRAM_NAME, *ARGV
|
16
|
+
end
|
17
|
+
|
11
18
|
begin
|
12
|
-
require '
|
19
|
+
require 'bundler/setup' if File.exist? 'Gemfile'
|
13
20
|
rescue LoadError
|
14
|
-
|
15
|
-
|
21
|
+
try_command_and_restart 'gem install bundler'
|
22
|
+
rescue SystemExit
|
23
|
+
try_command_and_restart 'bundle install'
|
16
24
|
end
|
17
25
|
|
18
|
-
|
26
|
+
begin
|
27
|
+
require 'go_script'
|
28
|
+
rescue LoadError
|
29
|
+
try_command_and_restart 'gem install go_script'
|
30
|
+
end
|
19
31
|
|
20
32
|
extend GoScript
|
33
|
+
check_ruby_version '#{RUBY_VERSION}'
|
21
34
|
|
22
|
-
|
23
|
-
dev_commands = GoScript::CommandGroup.add_group 'Development commands'
|
35
|
+
command_group :dev, 'Development commands'
|
24
36
|
|
25
|
-
def_command :init,
|
26
|
-
install_bundle
|
37
|
+
def_command :init, 'Set up the development environment' do
|
27
38
|
end
|
28
39
|
|
29
|
-
def_command :update_gems,
|
40
|
+
def_command :update_gems, 'Update Ruby gems' do |gems|
|
30
41
|
update_gems gems
|
31
42
|
end
|
32
43
|
|
33
|
-
def_command :update_js,
|
44
|
+
def_command :update_js, 'Update JavaScript components' do
|
34
45
|
update_node_modules
|
35
46
|
end
|
36
47
|
|
37
|
-
def_command :test,
|
48
|
+
def_command :test, 'Execute automated tests' do |args|
|
38
49
|
exec_cmd "bundle exec rake test \#{args.join ' '}"
|
39
50
|
end
|
40
51
|
|
41
|
-
def_command :lint,
|
52
|
+
def_command :lint, 'Run style-checking tools' do |files|
|
42
53
|
files = files.group_by { |f| File.extname f }
|
43
54
|
lint_ruby files['.rb']
|
44
55
|
lint_javascript BASEDIR, files['.js']
|
data/lib/go_script.rb
CHANGED
@@ -1,36 +1,84 @@
|
|
1
1
|
# Author: Mike Bland <michael.bland@gsa.gov>
|
2
2
|
|
3
|
+
require 'English'
|
4
|
+
require 'pathname'
|
5
|
+
|
3
6
|
module GoScript
|
7
|
+
class Command
|
8
|
+
attr_reader :description, :path, :lineno
|
9
|
+
|
10
|
+
def initialize(description, path, lineno)
|
11
|
+
@description = description
|
12
|
+
@path = path
|
13
|
+
@lineno = lineno
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
4
17
|
# Groups a set of commands by common function.
|
5
18
|
class CommandGroup
|
6
|
-
|
19
|
+
attr_reader :description, :path, :lineno
|
20
|
+
attr_accessor :commands
|
7
21
|
private_class_method :new
|
8
22
|
|
9
|
-
|
10
|
-
def initialize(description)
|
23
|
+
def initialize(description, path, lineno)
|
11
24
|
@description = description
|
25
|
+
@path = path
|
26
|
+
@lineno = lineno
|
12
27
|
@commands = {}
|
13
28
|
end
|
14
29
|
|
15
30
|
def to_s
|
16
31
|
padding = (commands.keys.max_by(&:size) || '').size + 2
|
17
|
-
command_descriptions = commands.map do |name,
|
18
|
-
format " %-#{padding}s#{
|
32
|
+
command_descriptions = commands.map do |name, command|
|
33
|
+
format " %-#{padding}s#{command.description}", name
|
19
34
|
end
|
20
35
|
["\n#{@description}"].concat(command_descriptions).join("\n")
|
21
36
|
end
|
22
37
|
|
38
|
+
def include_command?(command_symbol)
|
39
|
+
commands.keys.include? command_symbol
|
40
|
+
end
|
41
|
+
|
23
42
|
class <<self
|
24
|
-
|
25
|
-
|
26
|
-
(@groups ||= []).push(new(description)).last
|
43
|
+
def groups
|
44
|
+
@groups ||= {}
|
27
45
|
end
|
28
46
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
47
|
+
def location_path(target_path)
|
48
|
+
@base_path ||= Pathname.new(
|
49
|
+
File.dirname(File.expand_path $PROGRAM_NAME))
|
50
|
+
Pathname.new(File.expand_path target_path).relative_path_from @base_path
|
51
|
+
end
|
52
|
+
|
53
|
+
def check_not_defined(collection, label, key, path, lineno)
|
54
|
+
return unless (existing = collection[key])
|
55
|
+
previous = location_path existing.path
|
56
|
+
current = location_path path
|
57
|
+
prefix = previous == current ? 'line ' : previous + ':'
|
58
|
+
abort "#{current}:#{lineno}: #{label} \"#{key}\" " \
|
59
|
+
"already defined at #{prefix}#{existing.lineno}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_group(group_symbol, description, path, lineno)
|
63
|
+
check_not_defined groups, 'Command group', group_symbol, path, lineno
|
64
|
+
groups[group_symbol] = new description, path, lineno
|
65
|
+
end
|
66
|
+
|
67
|
+
def command_defined?(command)
|
68
|
+
groups.values.each { |g| return true if g.include_command? command }
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_command(command, group_symbol, description, path, lineno)
|
72
|
+
groups.values.each do |group|
|
73
|
+
check_not_defined group.commands, 'Command', command, path, lineno
|
32
74
|
end
|
33
|
-
|
75
|
+
groups[group_symbol].commands[command] = Command.new(
|
76
|
+
description, path, lineno)
|
77
|
+
end
|
78
|
+
|
79
|
+
def command(command_sym)
|
80
|
+
return command_sym if command_defined? command_sym
|
81
|
+
$stderr.puts "Unknown option or command: #{command_sym}"
|
34
82
|
usage exitstatus: 1
|
35
83
|
end
|
36
84
|
|
@@ -43,7 +91,7 @@ options:
|
|
43
91
|
-h,--help Show this help
|
44
92
|
-v,--version Show the version of the go_script gem
|
45
93
|
END_OF_USAGE
|
46
|
-
(groups || []).each { |group| output_stream.puts group }
|
94
|
+
(groups.values || []).each { |group| output_stream.puts group }
|
47
95
|
exit exitstatus
|
48
96
|
end
|
49
97
|
end
|
data/lib/go_script/go.rb
CHANGED
@@ -5,17 +5,32 @@ require_relative './version'
|
|
5
5
|
require 'English'
|
6
6
|
|
7
7
|
module GoScript
|
8
|
-
|
8
|
+
attr_reader :current_group
|
9
|
+
|
10
|
+
def check_ruby_version(min_version)
|
11
|
+
Version.check_ruby_version min_version
|
12
|
+
end
|
13
|
+
|
14
|
+
def command_group(group_symbol, description)
|
15
|
+
location = caller_locations(1, 1).first
|
16
|
+
CommandGroup.add_group(group_symbol, description,
|
17
|
+
location.path, location.lineno)
|
18
|
+
@current_group = group_symbol
|
19
|
+
end
|
20
|
+
|
21
|
+
def def_command(id, description, &command_block)
|
22
|
+
abort "#{$PROGRAM_NAME}: No command_groups defined" unless current_group
|
9
23
|
abort "Command ID must be a symbol: #{id}" unless id.instance_of? Symbol
|
10
|
-
self.class.send :define_method, id, ->(argv) { command_block.call
|
11
|
-
|
24
|
+
self.class.send :define_method, id, ->(*argv) { command_block.call(*argv) }
|
25
|
+
path, lineno = command_block.source_location
|
26
|
+
CommandGroup.add_command id, @current_group, description, path, lineno
|
12
27
|
end
|
13
28
|
|
14
29
|
def execute_command(argv)
|
15
30
|
command = argv.shift
|
16
31
|
CommandGroup.usage exitstatus: 1 if command.nil?
|
17
32
|
CommandGroup.usage if ['-h', '--help', '-help', 'help'].include? command
|
18
|
-
send version if ['-v', '--version', 'version'].include? command
|
33
|
+
send :version if ['-v', '--version', 'version'].include? command
|
19
34
|
send CommandGroup.command(command.to_sym), argv
|
20
35
|
end
|
21
36
|
|
@@ -32,9 +47,7 @@ module GoScript
|
|
32
47
|
begin
|
33
48
|
require 'bundler'
|
34
49
|
rescue LoadError
|
35
|
-
puts 'Installing Bundler gem...'
|
36
50
|
exec_cmd 'gem install bundler'
|
37
|
-
puts 'Bundler installed; installing gems'
|
38
51
|
end
|
39
52
|
exec_cmd 'bundle install'
|
40
53
|
end
|
@@ -63,9 +76,11 @@ module GoScript
|
|
63
76
|
exec_cmd "#{JEKYLL_BUILD_CMD} #{extra_args}"
|
64
77
|
end
|
65
78
|
|
66
|
-
def git_sync_and_deploy(commands)
|
79
|
+
def git_sync_and_deploy(commands, branch: nil)
|
67
80
|
exec_cmd 'git stash'
|
81
|
+
exec_cmd "git checkout -b #{branch}" unless branch.nil?
|
68
82
|
exec_cmd 'git pull'
|
83
|
+
exec_cmd 'bundle install' if File.exist? 'Gemfile'
|
69
84
|
commands.each { |command| exec_cmd command }
|
70
85
|
end
|
71
86
|
|
data/lib/go_script/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: go_script
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Bland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|