rigit 0.0.2 → 0.0.3
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 +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
|

|
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
|