rigit 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +178 -2
- data/lib/rigit/command_line.rb +8 -1
- data/lib/rigit/commands/build.rb +9 -3
- data/lib/rigit/commands/info.rb +46 -0
- data/lib/rigit/commands/install.rb +12 -7
- data/lib/rigit/commands/update.rb +54 -0
- data/lib/rigit/docopt.txt +20 -1
- data/lib/rigit/git.rb +6 -0
- data/lib/rigit/rig.rb +21 -4
- data/lib/rigit/version.rb +1 -1
- data/lib/rigit.rb +0 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0e095455913e67ecceddde67453c5e1b80198c8a1e8b1cc73bd3729b6aaa745
|
4
|
+
data.tar.gz: a34322fc5be2a3e94bc585a4232cedb8f0bf4975203b14c993b13ffd0a548a5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49ef20ec39ea53e8f3ceaa8ea3407fc7ef687c46f6d23f8b6449685e08d8aab3630c7093e480e3125c76a7f975210a828a90126b5abf077433f8672febb96de0
|
7
|
+
data.tar.gz: 00d2d1c8c2323004c704235ea3f7b2400c2e7ef37713597982ca63c01849aa062801b0647ba54f56ab7020f07c2e456e60e455afd1a693df5b3e5e751314e380
|
data/README.md
CHANGED
@@ -8,6 +8,8 @@ Rigit
|
|
8
8
|
|
9
9
|
---
|
10
10
|
|
11
|
+
Build project templates easily, and without the need to write code.
|
12
|
+
|
11
13
|
![Rigit](rigit-header.png)
|
12
14
|
|
13
15
|
---
|
@@ -16,34 +18,208 @@ Table of Contents
|
|
16
18
|
--------------------------------------------------
|
17
19
|
|
18
20
|
* [Installation](#installation)
|
21
|
+
* [Key Features](#key-features)
|
22
|
+
* [Usage](#usage)
|
19
23
|
* [Quick Start](#quick-start)
|
20
24
|
* [Installing Rigs](#installing-rigs)
|
21
25
|
* [Using Rigs (Scaffolding)](#using-rigs-scaffolding)
|
26
|
+
* [Non-Interactive Execution](#non-interactive-execution)
|
22
27
|
* [Creating Rigs](#creating-rigs)
|
23
|
-
|
24
|
-
|
28
|
+
* [Directory Structure](#directory-structure)
|
29
|
+
* [Dynamic Tokens](#dynamic-tokens)
|
30
|
+
* [Config File](#config-file)
|
31
|
+
|
25
32
|
|
26
33
|
|
27
34
|
Installation
|
28
35
|
--------------------------------------------------
|
29
36
|
|
37
|
+
$ gem install rigit
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
Key Features
|
42
|
+
--------------------------------------------------
|
43
|
+
|
44
|
+
Rigit was designed to allow the rapid building of reusable project templates.
|
45
|
+
In Rigit, we call these templates "rigs".
|
46
|
+
|
47
|
+
- No coding required.
|
48
|
+
- Conventions-based [folder structure](#directory-structure).
|
49
|
+
- A minimalistic [configuration file](#config-file) to allow specifying
|
50
|
+
needed parameters.
|
51
|
+
- [String replacement](#dynamic-tokens) in file names and file contents.
|
52
|
+
- [Install rigs](#installing-rigs) from any remote git repository.
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
Usage
|
57
|
+
--------------------------------------------------
|
58
|
+
|
59
|
+
```
|
60
|
+
$ rig
|
61
|
+
Usage:
|
62
|
+
rig build RIG [PARAMS...]
|
63
|
+
rig install RIG REPO
|
64
|
+
rig update RIG
|
65
|
+
rig info RIG
|
66
|
+
rig (-h|--help|--version)
|
67
|
+
```
|
68
|
+
|
69
|
+
|
30
70
|
|
31
71
|
Quick Start
|
32
72
|
--------------------------------------------------
|
33
73
|
|
74
|
+
After installing Rigit, you can follow these steps to quickly understand how
|
75
|
+
it works, and how you can create your own rigs.
|
76
|
+
|
77
|
+
First, create an empty folder:
|
78
|
+
|
79
|
+
$ mkdir myapp
|
80
|
+
$ cd muapp
|
81
|
+
|
82
|
+
Install your first rig. You can use this [example rig][example-rig].
|
83
|
+
|
84
|
+
$ rig install example https://github.com/DannyBen/example-rig.git
|
85
|
+
|
86
|
+
Now that your rig is installed (in `~/.rigs`), you can use it.
|
87
|
+
|
88
|
+
$ rig build example
|
89
|
+
|
90
|
+
Input all the answers, and you are done. Your project has been rigged.
|
91
|
+
|
92
|
+
|
34
93
|
|
35
94
|
Installing Rigs
|
36
95
|
--------------------------------------------------
|
37
96
|
|
97
|
+
Rigs are installed in `~/.rigs` by default. You can change the installation
|
98
|
+
directory by setting the `RIG_HOME` environment variable to your desired
|
99
|
+
path.
|
100
|
+
|
101
|
+
To install a rig, simply use the `rig install` command, and supply a name
|
102
|
+
(which will be the name of the rig in your local system) and a git URL (use
|
103
|
+
the same url as you would use in "git clone").
|
104
|
+
|
105
|
+
$ rig install example https://github.com/DannyBen/example-rig.git
|
106
|
+
|
107
|
+
|
38
108
|
|
39
109
|
Using Rigs (Scaffolding)
|
40
110
|
--------------------------------------------------
|
41
111
|
|
112
|
+
After you have one or more installed rigs, you can use them to create a new
|
113
|
+
project. Note that rigit works in the *current* directory, and will not
|
114
|
+
create the project root directory for you.
|
115
|
+
|
116
|
+
$ mkdir myapp
|
117
|
+
$ cd myapp
|
118
|
+
$ rig build example
|
119
|
+
|
120
|
+
Most rigs will have parameters, you will be prompted to input them as needed.
|
121
|
+
|
122
|
+
|
123
|
+
### Non-Interactive Execution
|
124
|
+
|
125
|
+
You can also provide some (or all) of the parameters in the command line,
|
126
|
+
if you need to avoid interactivity.
|
127
|
+
|
128
|
+
$ rig build example name=myapp spec=y console=irb license=MIT
|
129
|
+
|
130
|
+
To learn about the parameters of a rig:
|
131
|
+
|
132
|
+
$ rig info example
|
133
|
+
|
134
|
+
|
42
135
|
|
43
136
|
Creating Rigs
|
44
137
|
--------------------------------------------------
|
45
138
|
|
139
|
+
> **Tip**: Take a look at the [example rig][example-rig] while reading
|
140
|
+
> this section.
|
141
|
+
|
142
|
+
Rigit's main design goal was to allow rapid and easy creation of new
|
143
|
+
templates. There is no coding involved in creating a rig, and instead we
|
144
|
+
are using folders with specific names, to allow for a sort of "additive"
|
145
|
+
project building.
|
146
|
+
|
147
|
+
The steps in creating a rig are:
|
148
|
+
|
149
|
+
1. Start in a new, empty folder.
|
150
|
+
2. Create a folder named `base`. Put all the files and folders of your
|
151
|
+
project inside.
|
152
|
+
3. Rename files and folders, and files as needed to include dynamic tokens.
|
153
|
+
4. If you want to add some of the files only in specific cases (for example
|
154
|
+
only include a license file if the user wants to), you move the files to
|
155
|
+
a folder with s special `parameter=value` folder.
|
156
|
+
5. Create a config file to specify the needed parameters.
|
157
|
+
|
158
|
+
|
46
159
|
### Directory Structure
|
47
160
|
|
161
|
+
There are two types of folders in a rig template.
|
162
|
+
|
163
|
+
1. Base folder (`base`) - files and folders here will be copied always
|
164
|
+
2. Conditional folders (`parameter=value`) - contents in these folders will
|
165
|
+
only be copied if the user answerd `value` to the question `parameter`.
|
166
|
+
|
167
|
+
|
168
|
+
### Dynamic Tokens
|
169
|
+
|
170
|
+
You can use variable replacements (tokens) in file names, folder names and in
|
171
|
+
file contents.
|
172
|
+
|
173
|
+
Each token that you use, must also be declared in the config file.
|
174
|
+
|
175
|
+
Tokens are specified using this syntax:
|
176
|
+
|
177
|
+
%{name}
|
178
|
+
|
179
|
+
|
48
180
|
### Config File
|
49
181
|
|
182
|
+
Place a `config.yml` file at the root of your rig template. A config file
|
183
|
+
is optional for rigs that do not have any variables.
|
184
|
+
|
185
|
+
A typical config file looks like this:
|
186
|
+
|
187
|
+
```yaml
|
188
|
+
intro: A sample generator
|
189
|
+
|
190
|
+
params:
|
191
|
+
name:
|
192
|
+
prompt: "Name your project:"
|
193
|
+
type: text
|
194
|
+
default: project
|
195
|
+
|
196
|
+
spec:
|
197
|
+
prompt: Include RSpec files?
|
198
|
+
type: yesno
|
199
|
+
default: y
|
200
|
+
|
201
|
+
console:
|
202
|
+
prompt: "Select console:"
|
203
|
+
type: select
|
204
|
+
list: [irb, pry]
|
205
|
+
```
|
206
|
+
|
207
|
+
| Key | Purpose |
|
208
|
+
|----------|---------------------------------------------------------|
|
209
|
+
| `intro` | A short message to display when building (Optional) |
|
210
|
+
| `params` | A list of parameters required by the rig |
|
211
|
+
|
212
|
+
The `params` key should start with the name of the variable (`name`,
|
213
|
+
`spec` and `console` in the above example), and contain the below
|
214
|
+
specifications:
|
215
|
+
|
216
|
+
| Key | Purpose |
|
217
|
+
|-----------|----------------------------------------------------------|
|
218
|
+
| `prompt` | The text to display when asking for user input |
|
219
|
+
| `type` | The variable tyoe. Can be `yesno`, `text` or `select` |
|
220
|
+
| `default` | The default value. When using `yesno`, use `y` and `n` |
|
221
|
+
| `list` | An array of allowed options (only used in `select` type) |
|
222
|
+
|
223
|
+
---
|
224
|
+
|
225
|
+
[example-rig]: https://github.com/DannyBen/example-rig
|
data/lib/rigit/command_line.rb
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
require 'super_docopt'
|
2
2
|
require 'rigit/version'
|
3
3
|
|
4
|
+
require 'rigit/commands/build'
|
5
|
+
require 'rigit/commands/install'
|
6
|
+
require 'rigit/commands/update'
|
7
|
+
require 'rigit/commands/info'
|
8
|
+
|
4
9
|
module Rigit
|
5
10
|
class CommandLine < SuperDocopt::Base
|
6
11
|
version VERSION
|
7
12
|
docopt File.expand_path 'docopt.txt', __dir__
|
8
|
-
subcommands [:build, :install]
|
13
|
+
subcommands [:build, :install, :update, :info]
|
9
14
|
|
10
15
|
include Commands::Build
|
11
16
|
include Commands::Install
|
17
|
+
include Commands::Update
|
18
|
+
include Commands::Info
|
12
19
|
end
|
13
20
|
end
|
data/lib/rigit/commands/build.rb
CHANGED
@@ -3,10 +3,10 @@ require 'colsole'
|
|
3
3
|
module Rigit::Commands
|
4
4
|
module Build
|
5
5
|
def build
|
6
|
-
|
6
|
+
BuildHandler.new(args).execute
|
7
7
|
end
|
8
8
|
|
9
|
-
class
|
9
|
+
class BuildHandler
|
10
10
|
attr_reader :args, :rig_name, :target_dir
|
11
11
|
|
12
12
|
include Colsole
|
@@ -22,7 +22,13 @@ module Rigit::Commands
|
|
22
22
|
say "!txtblu!#{config.intro}" if config.has_key? :intro
|
23
23
|
verify_dirs
|
24
24
|
arguments = prompt.get_input params
|
25
|
-
rig.scaffold arguments:arguments, target_dir: target_dir
|
25
|
+
rig.scaffold arguments:arguments, target_dir: target_dir do |file|
|
26
|
+
if File.exist? file
|
27
|
+
tty_prompt.yes? "Overwrite #{file}?", default: false
|
28
|
+
else
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
26
32
|
say "Done"
|
27
33
|
end
|
28
34
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'colsole'
|
2
|
+
|
3
|
+
module Rigit::Commands
|
4
|
+
module Info
|
5
|
+
def info
|
6
|
+
InfoHandler.new(args).execute
|
7
|
+
end
|
8
|
+
|
9
|
+
class InfoHandler
|
10
|
+
include Colsole
|
11
|
+
|
12
|
+
attr_reader :args, :rig_name
|
13
|
+
|
14
|
+
def initialize(args)
|
15
|
+
@args = args
|
16
|
+
@rig_name = args['RIG']
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute
|
20
|
+
verify_presence
|
21
|
+
info
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def info
|
27
|
+
rig.info.each do |key, value|
|
28
|
+
say "!txtgrn!#{key}!txtrst!:"
|
29
|
+
say word_wrap " #{value}"
|
30
|
+
say ""
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def rig
|
35
|
+
@rig ||= Rigit::Rig.new rig_name
|
36
|
+
end
|
37
|
+
|
38
|
+
def verify_presence
|
39
|
+
if !rig.exist?
|
40
|
+
say "Cannot find rig !txtgrn!#{rig_name}"
|
41
|
+
raise Rigit::Exit
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -4,10 +4,10 @@ require 'colsole'
|
|
4
4
|
module Rigit::Commands
|
5
5
|
module Install
|
6
6
|
def install
|
7
|
-
|
7
|
+
InstallHandler.new(args).execute
|
8
8
|
end
|
9
9
|
|
10
|
-
class
|
10
|
+
class InstallHandler
|
11
11
|
include Colsole
|
12
12
|
|
13
13
|
attr_reader :args, :rig_name, :repo
|
@@ -26,15 +26,20 @@ module Rigit::Commands
|
|
26
26
|
private
|
27
27
|
|
28
28
|
def install
|
29
|
-
say "Installing !txtgrn!#{repo}
|
29
|
+
say "Installing !txtgrn!#{repo}"
|
30
30
|
FileUtils.mkdir_p target_path unless Dir.exist? target_path
|
31
|
-
success = Git.clone repo, target_path
|
31
|
+
success = Rigit::Git.clone repo, target_path
|
32
32
|
|
33
33
|
if success
|
34
|
-
say "
|
34
|
+
say "Rig installed !txtgrn!successfully!txtrst! in !txtgrn!#{target_path}"
|
35
35
|
say "To build a new project with this rig, run this in any empty directory:\n"
|
36
36
|
say " !txtpur!rig build #{rig_name}\n"
|
37
|
+
else
|
38
|
+
# :nocov:
|
39
|
+
say "!txtred!Installation failed"
|
40
|
+
# :nocov:
|
37
41
|
end
|
42
|
+
|
38
43
|
end
|
39
44
|
|
40
45
|
def rig
|
@@ -46,8 +51,8 @@ module Rigit::Commands
|
|
46
51
|
end
|
47
52
|
|
48
53
|
def verify_dirs
|
49
|
-
if
|
50
|
-
say "Rig !txtgrn!#{rig_name}!txtrst! is already installed
|
54
|
+
if rig.exist?
|
55
|
+
say "Rig !txtgrn!#{rig_name}!txtrst! is already installed"
|
51
56
|
say "In order to update it from the source repository, run:\n"
|
52
57
|
say " !txtpur!rig update #{rig_name}\n"
|
53
58
|
raise Rigit::Exit
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'colsole'
|
2
|
+
|
3
|
+
module Rigit::Commands
|
4
|
+
module Update
|
5
|
+
def update
|
6
|
+
UpdateHandler.new(args).execute
|
7
|
+
end
|
8
|
+
|
9
|
+
class UpdateHandler
|
10
|
+
include Colsole
|
11
|
+
|
12
|
+
attr_reader :args, :rig_name
|
13
|
+
|
14
|
+
def initialize(args)
|
15
|
+
@args = args
|
16
|
+
@rig_name = args['RIG']
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute
|
20
|
+
verify_dirs
|
21
|
+
update
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def update
|
27
|
+
say "Updating !txtgrn!#{rig_name}"
|
28
|
+
success = Rigit::Git.pull target_path
|
29
|
+
if success
|
30
|
+
say "Rig updated !txtgrn!successfully!txtrst!"
|
31
|
+
else
|
32
|
+
# :nocov:
|
33
|
+
say "!txtred!Update failed"
|
34
|
+
# :nocov:
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def rig
|
39
|
+
@rig ||= Rigit::Rig.new rig_name
|
40
|
+
end
|
41
|
+
|
42
|
+
def target_path
|
43
|
+
@target_path ||= rig.path
|
44
|
+
end
|
45
|
+
|
46
|
+
def verify_dirs
|
47
|
+
if !rig.exist?
|
48
|
+
say "Rig !txtgrn!#{rig_name}!txtrst! is not installed"
|
49
|
+
raise Rigit::Exit
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/rigit/docopt.txt
CHANGED
@@ -3,6 +3,9 @@ Rigit
|
|
3
3
|
Usage:
|
4
4
|
rig build RIG [PARAMS...]
|
5
5
|
rig install RIG REPO
|
6
|
+
rig update RIG
|
7
|
+
rig info RIG
|
8
|
+
rig (-h|--help|--version)
|
6
9
|
|
7
10
|
Commands:
|
8
11
|
build
|
@@ -12,6 +15,15 @@ Commands:
|
|
12
15
|
If you wish to execute this command without interactivity, you may
|
13
16
|
use specify all parameters in the PARAMS parameter (see below).
|
14
17
|
|
18
|
+
install
|
19
|
+
Clone a remote rig git repository and install it locally.
|
20
|
+
|
21
|
+
update
|
22
|
+
Update an installed rig to its latest version.
|
23
|
+
|
24
|
+
info
|
25
|
+
Show some meta information about an installed rig.
|
26
|
+
|
15
27
|
Parameters:
|
16
28
|
RIG
|
17
29
|
The name of the source folder (installed rig).
|
@@ -24,6 +36,13 @@ Parameters:
|
|
24
36
|
Specify any of the rig's parameters in the format 'param=value'.
|
25
37
|
For boolean parameters, use 'param=y' or 'param=n'.
|
26
38
|
|
39
|
+
Environment Variables:
|
40
|
+
RIG_HOME
|
41
|
+
The path where your local rigs are installed (default: ~/.rigs)
|
42
|
+
|
27
43
|
Examples:
|
28
44
|
rig build gem name=mygem spec=y
|
29
|
-
rig install example https://github.com/DannyBen/example-rig.git
|
45
|
+
rig install example https://github.com/DannyBen/example-rig.git
|
46
|
+
rig update example
|
47
|
+
rig info example
|
48
|
+
|
data/lib/rigit/git.rb
CHANGED
data/lib/rigit/rig.rb
CHANGED
@@ -14,13 +14,15 @@ module Rigit
|
|
14
14
|
@name = name
|
15
15
|
end
|
16
16
|
|
17
|
-
def scaffold(arguments: {}, target_dir:'.')
|
18
|
-
scaffold_dir "#{path}/base", arguments,
|
17
|
+
def scaffold(arguments: {}, target_dir:'.', &block)
|
18
|
+
scaffold_dir dir: "#{path}/base", arguments: arguments,
|
19
|
+
target_dir: target_dir, &block
|
19
20
|
|
20
21
|
arguments.each do |key, value|
|
21
22
|
additive_dir = "#{path}/#{key}=#{value}"
|
22
23
|
if Dir.exist? additive_dir
|
23
|
-
scaffold_dir additive_dir, arguments,
|
24
|
+
scaffold_dir dir: additive_dir, arguments: arguments,
|
25
|
+
target_dir: target_dir, &block
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
@@ -33,6 +35,10 @@ module Rigit
|
|
33
35
|
Dir.exist? path
|
34
36
|
end
|
35
37
|
|
38
|
+
def has_config?
|
39
|
+
File.exist? config_file
|
40
|
+
end
|
41
|
+
|
36
42
|
def config_file
|
37
43
|
"#{path}/config.yml"
|
38
44
|
end
|
@@ -41,13 +47,24 @@ module Rigit
|
|
41
47
|
@config ||= Config.load(config_file)
|
42
48
|
end
|
43
49
|
|
50
|
+
def info
|
51
|
+
{
|
52
|
+
name: name,
|
53
|
+
path: path,
|
54
|
+
config: (has_config? ? File.read(config_file) : '<empty>')
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
44
58
|
private
|
45
59
|
|
46
|
-
def scaffold_dir(dir
|
60
|
+
def scaffold_dir(dir:, arguments:, target_dir:)
|
47
61
|
files = Dir["#{dir}/**/*"].reject { |file| File.directory? file }
|
48
62
|
|
49
63
|
files.each do |file|
|
50
64
|
target_file = (file % arguments).sub dir, target_dir
|
65
|
+
|
66
|
+
next if block_given? and !yield target_file
|
67
|
+
|
51
68
|
content = File.read(file) % arguments
|
52
69
|
File.deep_write target_file, content
|
53
70
|
end
|
data/lib/rigit/version.rb
CHANGED
data/lib/rigit.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rigit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
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: 2018-02-
|
11
|
+
date: 2018-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: super_docopt
|
@@ -190,7 +190,9 @@ files:
|
|
190
190
|
- lib/rigit.rb
|
191
191
|
- lib/rigit/command_line.rb
|
192
192
|
- lib/rigit/commands/build.rb
|
193
|
+
- lib/rigit/commands/info.rb
|
193
194
|
- lib/rigit/commands/install.rb
|
195
|
+
- lib/rigit/commands/update.rb
|
194
196
|
- lib/rigit/config.rb
|
195
197
|
- lib/rigit/docopt.txt
|
196
198
|
- lib/rigit/errors.rb
|