rbcli 0.1.10 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -0
- data/CODE_OF_CONDUCT.md +1 -1
- data/Gemfile.lock +12 -12
- data/LICENSE.txt +674 -21
- data/README.md +80 -443
- data/bin/console +19 -0
- data/bin/setup +20 -0
- data/docs/404.html +639 -0
- data/docs/advanced/automatic_updates/index.html +791 -0
- data/docs/advanced/command_types/index.html +946 -0
- data/docs/advanced/distributed_state_locking/index.html +777 -0
- data/docs/advanced/hooks/index.html +836 -0
- data/docs/advanced/state_storage/index.html +957 -0
- data/docs/advanced/user_config_files/index.html +818 -0
- data/docs/assets/fonts/font-awesome.css +4 -0
- data/docs/assets/fonts/material-icons.css +13 -0
- data/docs/assets/fonts/specimen/FontAwesome.ttf +0 -0
- data/docs/assets/fonts/specimen/FontAwesome.woff +0 -0
- data/docs/assets/fonts/specimen/FontAwesome.woff2 +0 -0
- data/docs/assets/fonts/specimen/MaterialIcons-Regular.ttf +0 -0
- data/docs/assets/fonts/specimen/MaterialIcons-Regular.woff +0 -0
- data/docs/assets/fonts/specimen/MaterialIcons-Regular.woff2 +0 -0
- data/docs/assets/images/favicon.png +0 -0
- data/docs/assets/images/icons/bitbucket.1b09e088.svg +20 -0
- data/docs/assets/images/icons/github.f0b8504a.svg +18 -0
- data/docs/assets/images/icons/gitlab.6dd19c00.svg +38 -0
- data/docs/assets/javascripts/application.a59e2a89.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.da.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.de.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.du.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.es.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.fi.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.fr.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.hu.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.it.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.jp.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.multi.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.no.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.pt.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.ro.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.ru.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.stemmer.support.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.sv.js +1 -0
- data/docs/assets/javascripts/lunr/lunr.tr.js +1 -0
- data/docs/assets/javascripts/lunr/tinyseg.js +1 -0
- data/docs/assets/javascripts/modernizr.1aa3b519.js +1 -0
- data/docs/assets/stylesheets/application-palette.6079476c.css +2 -0
- data/docs/assets/stylesheets/application.ba0fd1a6.css +2 -0
- data/docs/development/code_of_conduct/index.html +883 -0
- data/docs/development/contributing/index.html +744 -0
- data/docs/development/license/index.html +715 -0
- data/docs/imported/changelog/index.html +853 -0
- data/docs/imported/quick_reference/index.html +1057 -0
- data/docs/index.html +732 -0
- data/docs/search/search_index.json +569 -0
- data/docs/sitemap.xml +93 -0
- data/docs/tutorial/10-getting_started/index.html +806 -0
- data/docs/tutorial/20-project_layout/index.html +972 -0
- data/docs/tutorial/30-your_first_command/index.html +906 -0
- data/docs/tutorial/40-options_parameters_and_arguments/index.html +1049 -0
- data/docs/tutorial/50-publishing/index.html +838 -0
- data/docs/whoami/index.html +709 -0
- data/docs-src/docs/advanced/automatic_updates.md +42 -0
- data/docs-src/docs/advanced/command_types.md +144 -0
- data/docs-src/docs/advanced/distributed_state_locking.md +33 -0
- data/docs-src/docs/advanced/hooks.md +65 -0
- data/docs-src/docs/advanced/logging.md +35 -0
- data/docs-src/docs/advanced/state_storage.md +117 -0
- data/docs-src/docs/advanced/user_config_files.md +47 -0
- data/docs-src/docs/development/code_of_conduct.md +74 -0
- data/docs-src/docs/development/contributing.md +49 -0
- data/docs-src/docs/development/license.md +10 -0
- data/docs-src/docs/imported/changelog.md +31 -0
- data/docs-src/docs/imported/quick_reference.md +150 -0
- data/docs-src/docs/index.md +38 -0
- data/docs-src/docs/tutorial/10-getting_started.md +41 -0
- data/docs-src/docs/tutorial/20-project_layout.md +115 -0
- data/docs-src/docs/tutorial/30-your_first_command.md +126 -0
- data/docs-src/docs/tutorial/40-options_parameters_and_arguments.md +251 -0
- data/docs-src/docs/tutorial/50-publishing.md +47 -0
- data/docs-src/docs/whoami.md +28 -0
- data/docs-src/makesite.sh +14 -0
- data/docs-src/mkdocs.yml +76 -0
- data/docs-src/runsite.sh +3 -0
- data/exe/rbcli +76 -5
- data/lib/rbcli/autoupdate/autoupdate.rb +24 -4
- data/lib/rbcli/autoupdate/gem_updater.rb +23 -2
- data/lib/rbcli/autoupdate/github_updater.rb +22 -1
- data/lib/rbcli/configuration/config.rb +22 -1
- data/lib/rbcli/configuration/configurate.rb +24 -2
- data/lib/rbcli/engine/command.rb +26 -6
- data/lib/rbcli/engine/load_project.rb +29 -3
- data/lib/rbcli/engine/parser.rb +25 -4
- data/lib/rbcli/logging/logging.rb +21 -0
- data/lib/rbcli/scriptwrapping/scriptwrapper.rb +30 -11
- data/lib/rbcli/stateful_systems/configuratestorage.rb +20 -0
- data/lib/rbcli/stateful_systems/state_storage.rb +20 -0
- data/lib/rbcli/stateful_systems/storagetypes/localstate.rb +20 -0
- data/lib/rbcli/stateful_systems/storagetypes/remote_state_connectors/dynamodb.rb +20 -0
- data/lib/rbcli/stateful_systems/storagetypes/remotestate_dynamodb.rb +20 -0
- data/lib/rbcli/util/hash_deep_symbolize.rb +43 -22
- data/lib/rbcli/util/string_colorize.rb +20 -0
- data/lib/rbcli/version.rb +21 -1
- data/lib/rbcli-tool/generators.rb +20 -0
- data/lib/rbcli-tool/mdless_fix.rb +20 -0
- data/lib/rbcli-tool/project.rb +27 -2
- data/lib/rbcli-tool/util.rb +20 -0
- data/lib/rbcli-tool.rb +20 -0
- data/lib/rbcli.rb +20 -0
- data/lib-sh/lib-rbcli.sh +19 -0
- data/rbcli.gemspec +22 -3
- data/skeletons/project/CODE_OF_CONDUCT.md +1 -1
- data/skeletons/project/README.md +17 -2
- data/skeletons/project/application/commands/command.erb +10 -8
- data/skeletons/project/application/commands/script.erb +3 -1
- data/skeletons/project/application/commands/scripts/script.sh +2 -2
- data/skeletons/project/application/options.rb +12 -3
- data/skeletons/project/config/autoupdate.rb +5 -2
- data/skeletons/project/config/storage.rb +7 -6
- data/skeletons/project/config/userspace.rb +6 -1
- data/skeletons/project/exe/executable +1 -1
- data/skeletons/project/lib/.keep +0 -0
- data/skeletons/project/untitled.gemspec +4 -4
- data/skeletons/project/{default_user_configs → userconf}/user_defaults.yml +0 -0
- metadata +85 -9
- data/examples/defaults.yml +0 -4
- data/examples/myscript.sh +0 -23
- data/examples/mytool +0 -95
data/docs/index.html
ADDED
@@ -0,0 +1,732 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
<!DOCTYPE html>
|
6
|
+
<html lang="en" class="no-js">
|
7
|
+
<head>
|
8
|
+
|
9
|
+
<meta charset="utf-8">
|
10
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
11
|
+
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
12
|
+
|
13
|
+
<meta name="description" content="Description">
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
<meta name="author" content="Andrew Khoury">
|
18
|
+
|
19
|
+
|
20
|
+
<meta name="lang:clipboard.copy" content="Copy to clipboard">
|
21
|
+
|
22
|
+
<meta name="lang:clipboard.copied" content="Copied to clipboard">
|
23
|
+
|
24
|
+
<meta name="lang:search.language" content="en">
|
25
|
+
|
26
|
+
<meta name="lang:search.pipeline.stopwords" content="True">
|
27
|
+
|
28
|
+
<meta name="lang:search.pipeline.trimmer" content="True">
|
29
|
+
|
30
|
+
<meta name="lang:search.result.none" content="No matching documents">
|
31
|
+
|
32
|
+
<meta name="lang:search.result.one" content="1 matching document">
|
33
|
+
|
34
|
+
<meta name="lang:search.result.other" content="# matching documents">
|
35
|
+
|
36
|
+
<meta name="lang:search.tokenizer" content="[\s\-]+">
|
37
|
+
|
38
|
+
<link rel="shortcut icon" href="./assets/images/favicon.png">
|
39
|
+
<meta name="generator" content="mkdocs-0.17.5, mkdocs-material-2.9.2">
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
<title>RBCli Documentation</title>
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
<link rel="stylesheet" href="./assets/stylesheets/application.ba0fd1a6.css">
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
<script src="./assets/javascripts/modernizr.1aa3b519.js"></script>
|
53
|
+
|
54
|
+
|
55
|
+
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
|
56
|
+
|
57
|
+
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
|
58
|
+
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
|
59
|
+
|
60
|
+
|
61
|
+
<link rel="stylesheet" href="./assets/fonts/material-icons.css">
|
62
|
+
|
63
|
+
|
64
|
+
</head>
|
65
|
+
|
66
|
+
<body dir="ltr">
|
67
|
+
|
68
|
+
<svg class="md-svg">
|
69
|
+
<defs>
|
70
|
+
|
71
|
+
|
72
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448"
|
73
|
+
viewBox="0 0 416 448" id="__github">
|
74
|
+
<path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19-18.125
|
75
|
+
8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19 18.125-8.5
|
76
|
+
18.125 8.5 10.75 19 3.125 20.5zM320 304q0 10-3.125 20.5t-10.75
|
77
|
+
19-18.125 8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19
|
78
|
+
18.125-8.5 18.125 8.5 10.75 19 3.125 20.5zM360
|
79
|
+
304q0-30-17.25-51t-46.75-21q-10.25 0-48.75 5.25-17.75 2.75-39.25
|
80
|
+
2.75t-39.25-2.75q-38-5.25-48.75-5.25-29.5 0-46.75 21t-17.25 51q0 22 8
|
81
|
+
38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0
|
82
|
+
37.25-1.75t35-7.375 30.5-15 20.25-25.75 8-38.375zM416 260q0 51.75-15.25
|
83
|
+
82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5-41.75
|
84
|
+
1.125q-19.5 0-35.5-0.75t-36.875-3.125-38.125-7.5-34.25-12.875-30.25-20.25-21.5-28.75q-15.5-30.75-15.5-82.75
|
85
|
+
0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25
|
86
|
+
30.875q36.75-8.75 77.25-8.75 37 0 70 8 26.25-20.5
|
87
|
+
46.75-30.25t47.25-9.75q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34
|
88
|
+
99.5z" />
|
89
|
+
</svg>
|
90
|
+
|
91
|
+
</defs>
|
92
|
+
</svg>
|
93
|
+
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
94
|
+
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
95
|
+
<label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
|
96
|
+
|
97
|
+
<a href="#this-is-rbcli" tabindex="1" class="md-skip">
|
98
|
+
Skip to content
|
99
|
+
</a>
|
100
|
+
|
101
|
+
|
102
|
+
<header class="md-header" data-md-component="header">
|
103
|
+
<nav class="md-header-nav md-grid">
|
104
|
+
<div class="md-flex">
|
105
|
+
<div class="md-flex__cell md-flex__cell--shrink">
|
106
|
+
<a href="." title="RBCli Documentation" class="md-header-nav__button md-logo">
|
107
|
+
|
108
|
+
<i class="md-icon">devices</i>
|
109
|
+
|
110
|
+
</a>
|
111
|
+
</div>
|
112
|
+
<div class="md-flex__cell md-flex__cell--shrink">
|
113
|
+
<label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
|
114
|
+
</div>
|
115
|
+
<div class="md-flex__cell md-flex__cell--stretch">
|
116
|
+
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
|
117
|
+
|
118
|
+
|
119
|
+
<span class="md-header-nav__topic">
|
120
|
+
RBCli Documentation
|
121
|
+
</span>
|
122
|
+
<span class="md-header-nav__topic">
|
123
|
+
Home
|
124
|
+
</span>
|
125
|
+
|
126
|
+
|
127
|
+
</div>
|
128
|
+
</div>
|
129
|
+
<div class="md-flex__cell md-flex__cell--shrink">
|
130
|
+
|
131
|
+
|
132
|
+
<label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
|
133
|
+
|
134
|
+
<div class="md-search" data-md-component="search" role="dialog">
|
135
|
+
<label class="md-search__overlay" for="__search"></label>
|
136
|
+
<div class="md-search__inner" role="search">
|
137
|
+
<form class="md-search__form" name="search">
|
138
|
+
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
|
139
|
+
<label class="md-icon md-search__icon" for="__search"></label>
|
140
|
+
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
|
141
|
+

|
142
|
+
</button>
|
143
|
+
</form>
|
144
|
+
<div class="md-search__output">
|
145
|
+
<div class="md-search__scrollwrap" data-md-scrollfix>
|
146
|
+
<div class="md-search-result" data-md-component="result">
|
147
|
+
<div class="md-search-result__meta">
|
148
|
+
Type to start searching
|
149
|
+
</div>
|
150
|
+
<ol class="md-search-result__list"></ol>
|
151
|
+
</div>
|
152
|
+
</div>
|
153
|
+
</div>
|
154
|
+
</div>
|
155
|
+
</div>
|
156
|
+
|
157
|
+
|
158
|
+
</div>
|
159
|
+
|
160
|
+
<div class="md-flex__cell md-flex__cell--shrink">
|
161
|
+
<div class="md-header-nav__source">
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
|
168
|
+
<a href="https://github.com/akhoury6/rbcli/" title="Go to repository" class="md-source" data-md-source="github">
|
169
|
+
|
170
|
+
<div class="md-source__icon">
|
171
|
+
<svg viewBox="0 0 24 24" width="24" height="24">
|
172
|
+
<use xlink:href="#__github" width="24" height="24"></use>
|
173
|
+
</svg>
|
174
|
+
</div>
|
175
|
+
|
176
|
+
<div class="md-source__repository">
|
177
|
+
GitHub
|
178
|
+
</div>
|
179
|
+
</a>
|
180
|
+
|
181
|
+
</div>
|
182
|
+
</div>
|
183
|
+
|
184
|
+
</div>
|
185
|
+
</nav>
|
186
|
+
</header>
|
187
|
+
|
188
|
+
<div class="md-container">
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
<nav class="md-tabs" data-md-component="tabs">
|
196
|
+
<div class="md-tabs__inner md-grid">
|
197
|
+
<ul class="md-tabs__list">
|
198
|
+
|
199
|
+
|
200
|
+
<li class="md-tabs__item">
|
201
|
+
|
202
|
+
<a href="." title="Home" class="md-tabs__link md-tabs__link--active">
|
203
|
+
Home
|
204
|
+
</a>
|
205
|
+
|
206
|
+
</li>
|
207
|
+
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
<li class="md-tabs__item">
|
215
|
+
|
216
|
+
<a href="tutorial/10-getting_started/" title="Tutorial" class="md-tabs__link">
|
217
|
+
Tutorial
|
218
|
+
</a>
|
219
|
+
|
220
|
+
</li>
|
221
|
+
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
<li class="md-tabs__item">
|
228
|
+
|
229
|
+
<a href="advanced/command_types/" title="Advanced Features" class="md-tabs__link">
|
230
|
+
Advanced Features
|
231
|
+
</a>
|
232
|
+
|
233
|
+
</li>
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
|
238
|
+
|
239
|
+
|
240
|
+
<li class="md-tabs__item">
|
241
|
+
|
242
|
+
<a href="development/contributing/" title="Development" class="md-tabs__link">
|
243
|
+
Development
|
244
|
+
</a>
|
245
|
+
|
246
|
+
</li>
|
247
|
+
|
248
|
+
|
249
|
+
|
250
|
+
|
251
|
+
|
252
|
+
</ul>
|
253
|
+
</div>
|
254
|
+
</nav>
|
255
|
+
|
256
|
+
<main class="md-main">
|
257
|
+
<div class="md-main__inner md-grid" data-md-component="container">
|
258
|
+
|
259
|
+
|
260
|
+
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
261
|
+
<div class="md-sidebar__scrollwrap">
|
262
|
+
<div class="md-sidebar__inner">
|
263
|
+
<nav class="md-nav md-nav--primary" data-md-level="0">
|
264
|
+
<label class="md-nav__title md-nav__title--site" for="__drawer">
|
265
|
+
<span class="md-nav__button md-logo">
|
266
|
+
|
267
|
+
<i class="md-icon">devices</i>
|
268
|
+
|
269
|
+
</span>
|
270
|
+
RBCli Documentation
|
271
|
+
</label>
|
272
|
+
|
273
|
+
<div class="md-nav__source">
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
|
278
|
+
|
279
|
+
|
280
|
+
<a href="https://github.com/akhoury6/rbcli/" title="Go to repository" class="md-source" data-md-source="github">
|
281
|
+
|
282
|
+
<div class="md-source__icon">
|
283
|
+
<svg viewBox="0 0 24 24" width="24" height="24">
|
284
|
+
<use xlink:href="#__github" width="24" height="24"></use>
|
285
|
+
</svg>
|
286
|
+
</div>
|
287
|
+
|
288
|
+
<div class="md-source__repository">
|
289
|
+
GitHub
|
290
|
+
</div>
|
291
|
+
</a>
|
292
|
+
|
293
|
+
</div>
|
294
|
+
|
295
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
296
|
+
|
297
|
+
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
|
304
|
+
<li class="md-nav__item md-nav__item--active">
|
305
|
+
|
306
|
+
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="__toc">
|
307
|
+
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
<a href="." title="Home" class="md-nav__link md-nav__link--active">
|
312
|
+
Home
|
313
|
+
</a>
|
314
|
+
|
315
|
+
</li>
|
316
|
+
|
317
|
+
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
<li class="md-nav__item">
|
324
|
+
<a href="imported/quick_reference/" title="Quick Reference" class="md-nav__link">
|
325
|
+
Quick Reference
|
326
|
+
</a>
|
327
|
+
</li>
|
328
|
+
|
329
|
+
|
330
|
+
|
331
|
+
|
332
|
+
|
333
|
+
|
334
|
+
|
335
|
+
<li class="md-nav__item md-nav__item--nested">
|
336
|
+
|
337
|
+
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
|
338
|
+
|
339
|
+
<label class="md-nav__link" for="nav-3">
|
340
|
+
Tutorial
|
341
|
+
</label>
|
342
|
+
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
343
|
+
<label class="md-nav__title" for="nav-3">
|
344
|
+
Tutorial
|
345
|
+
</label>
|
346
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
347
|
+
|
348
|
+
|
349
|
+
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
|
354
|
+
<li class="md-nav__item">
|
355
|
+
<a href="tutorial/10-getting_started/" title="Getting Started" class="md-nav__link">
|
356
|
+
Getting Started
|
357
|
+
</a>
|
358
|
+
</li>
|
359
|
+
|
360
|
+
|
361
|
+
|
362
|
+
|
363
|
+
|
364
|
+
|
365
|
+
|
366
|
+
<li class="md-nav__item">
|
367
|
+
<a href="tutorial/20-project_layout/" title="The Project Layout" class="md-nav__link">
|
368
|
+
The Project Layout
|
369
|
+
</a>
|
370
|
+
</li>
|
371
|
+
|
372
|
+
|
373
|
+
|
374
|
+
|
375
|
+
|
376
|
+
|
377
|
+
|
378
|
+
<li class="md-nav__item">
|
379
|
+
<a href="tutorial/30-your_first_command/" title="Your First Command" class="md-nav__link">
|
380
|
+
Your First Command
|
381
|
+
</a>
|
382
|
+
</li>
|
383
|
+
|
384
|
+
|
385
|
+
|
386
|
+
|
387
|
+
|
388
|
+
|
389
|
+
|
390
|
+
<li class="md-nav__item">
|
391
|
+
<a href="tutorial/40-options_parameters_and_arguments/" title="Options, Parameters, and Arguments" class="md-nav__link">
|
392
|
+
Options, Parameters, and Arguments
|
393
|
+
</a>
|
394
|
+
</li>
|
395
|
+
|
396
|
+
|
397
|
+
|
398
|
+
|
399
|
+
|
400
|
+
|
401
|
+
|
402
|
+
<li class="md-nav__item">
|
403
|
+
<a href="tutorial/50-publishing/" title="Publishing and Distribution" class="md-nav__link">
|
404
|
+
Publishing and Distribution
|
405
|
+
</a>
|
406
|
+
</li>
|
407
|
+
|
408
|
+
|
409
|
+
</ul>
|
410
|
+
</nav>
|
411
|
+
</li>
|
412
|
+
|
413
|
+
|
414
|
+
|
415
|
+
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
<li class="md-nav__item md-nav__item--nested">
|
420
|
+
|
421
|
+
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
|
422
|
+
|
423
|
+
<label class="md-nav__link" for="nav-4">
|
424
|
+
Advanced Features
|
425
|
+
</label>
|
426
|
+
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
427
|
+
<label class="md-nav__title" for="nav-4">
|
428
|
+
Advanced Features
|
429
|
+
</label>
|
430
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
431
|
+
|
432
|
+
|
433
|
+
|
434
|
+
|
435
|
+
|
436
|
+
|
437
|
+
|
438
|
+
<li class="md-nav__item">
|
439
|
+
<a href="advanced/command_types/" title="Command Types" class="md-nav__link">
|
440
|
+
Command Types
|
441
|
+
</a>
|
442
|
+
</li>
|
443
|
+
|
444
|
+
|
445
|
+
|
446
|
+
|
447
|
+
|
448
|
+
|
449
|
+
|
450
|
+
<li class="md-nav__item">
|
451
|
+
<a href="advanced/user_config_files/" title="User Config Files" class="md-nav__link">
|
452
|
+
User Config Files
|
453
|
+
</a>
|
454
|
+
</li>
|
455
|
+
|
456
|
+
|
457
|
+
|
458
|
+
|
459
|
+
|
460
|
+
|
461
|
+
|
462
|
+
<li class="md-nav__item">
|
463
|
+
<a href="advanced/hooks/" title="Hooks" class="md-nav__link">
|
464
|
+
Hooks
|
465
|
+
</a>
|
466
|
+
</li>
|
467
|
+
|
468
|
+
|
469
|
+
|
470
|
+
|
471
|
+
|
472
|
+
|
473
|
+
|
474
|
+
<li class="md-nav__item">
|
475
|
+
<a href="advanced/automatic_updates/" title="Automatic Updates" class="md-nav__link">
|
476
|
+
Automatic Updates
|
477
|
+
</a>
|
478
|
+
</li>
|
479
|
+
|
480
|
+
|
481
|
+
|
482
|
+
|
483
|
+
|
484
|
+
|
485
|
+
|
486
|
+
<li class="md-nav__item">
|
487
|
+
<a href="advanced/state_storage/" title="State Storage" class="md-nav__link">
|
488
|
+
State Storage
|
489
|
+
</a>
|
490
|
+
</li>
|
491
|
+
|
492
|
+
|
493
|
+
|
494
|
+
|
495
|
+
|
496
|
+
|
497
|
+
|
498
|
+
<li class="md-nav__item">
|
499
|
+
<a href="advanced/distributed_state_locking/" title="Distributed State Locking" class="md-nav__link">
|
500
|
+
Distributed State Locking
|
501
|
+
</a>
|
502
|
+
</li>
|
503
|
+
|
504
|
+
|
505
|
+
</ul>
|
506
|
+
</nav>
|
507
|
+
</li>
|
508
|
+
|
509
|
+
|
510
|
+
|
511
|
+
|
512
|
+
|
513
|
+
|
514
|
+
|
515
|
+
<li class="md-nav__item md-nav__item--nested">
|
516
|
+
|
517
|
+
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
|
518
|
+
|
519
|
+
<label class="md-nav__link" for="nav-5">
|
520
|
+
Development
|
521
|
+
</label>
|
522
|
+
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
523
|
+
<label class="md-nav__title" for="nav-5">
|
524
|
+
Development
|
525
|
+
</label>
|
526
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
527
|
+
|
528
|
+
|
529
|
+
|
530
|
+
|
531
|
+
|
532
|
+
|
533
|
+
|
534
|
+
<li class="md-nav__item">
|
535
|
+
<a href="development/contributing/" title="Contribution Guide" class="md-nav__link">
|
536
|
+
Contribution Guide
|
537
|
+
</a>
|
538
|
+
</li>
|
539
|
+
|
540
|
+
|
541
|
+
|
542
|
+
|
543
|
+
|
544
|
+
|
545
|
+
|
546
|
+
<li class="md-nav__item">
|
547
|
+
<a href="development/license/" title="License Info" class="md-nav__link">
|
548
|
+
License Info
|
549
|
+
</a>
|
550
|
+
</li>
|
551
|
+
|
552
|
+
|
553
|
+
|
554
|
+
|
555
|
+
|
556
|
+
|
557
|
+
|
558
|
+
<li class="md-nav__item">
|
559
|
+
<a href="development/code_of_conduct/" title="Code of Conduct" class="md-nav__link">
|
560
|
+
Code of Conduct
|
561
|
+
</a>
|
562
|
+
</li>
|
563
|
+
|
564
|
+
|
565
|
+
|
566
|
+
|
567
|
+
|
568
|
+
|
569
|
+
|
570
|
+
<li class="md-nav__item">
|
571
|
+
<a href="imported/changelog/" title="Changelog" class="md-nav__link">
|
572
|
+
Changelog
|
573
|
+
</a>
|
574
|
+
</li>
|
575
|
+
|
576
|
+
|
577
|
+
</ul>
|
578
|
+
</nav>
|
579
|
+
</li>
|
580
|
+
|
581
|
+
|
582
|
+
|
583
|
+
|
584
|
+
|
585
|
+
|
586
|
+
|
587
|
+
<li class="md-nav__item">
|
588
|
+
<a href="whoami/" title="$ whoami" class="md-nav__link">
|
589
|
+
$ whoami
|
590
|
+
</a>
|
591
|
+
</li>
|
592
|
+
|
593
|
+
|
594
|
+
</ul>
|
595
|
+
</nav>
|
596
|
+
</div>
|
597
|
+
</div>
|
598
|
+
</div>
|
599
|
+
|
600
|
+
|
601
|
+
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
602
|
+
<div class="md-sidebar__scrollwrap">
|
603
|
+
<div class="md-sidebar__inner">
|
604
|
+
|
605
|
+
<nav class="md-nav md-nav--secondary">
|
606
|
+
|
607
|
+
|
608
|
+
|
609
|
+
|
610
|
+
|
611
|
+
</nav>
|
612
|
+
</div>
|
613
|
+
</div>
|
614
|
+
</div>
|
615
|
+
|
616
|
+
|
617
|
+
<div class="md-content">
|
618
|
+
<article class="md-content__inner md-typeset">
|
619
|
+
|
620
|
+
|
621
|
+
|
622
|
+
<h1 id="this-is-rbcli">This is RBCli</h1>
|
623
|
+
<p>As technologists today, we work with the command line a lot. We script a lot. We write tools to share with each other to make our lives easier. We even write applications to make up for missing features in the 3rd party software that we buy. Unfortunately, when writing CLI tools, this process has typically been very painful. We've been working with low-level frameworks for decades; frameworks like <code>getopt</code> (1980) and <code>curses</code> (1977). They fit their purpose well; they were both computationally lightweight for the computers of the day, and they gave engineers full control and flexibility when it came to how things were built. Over the years, we've used them to settle on several design patterns that we know work well. Patterns as to what a CLI command looks like, what a config file looks like, what remote execution looks like, and even how to use locks (mutexes, semaphores, etc) to control application flow and data atomicity. Yet we're stuck writing the same low-level code anytime we want to write our tooling. Not anymore.</p>
|
624
|
+
<p>Enter RBCli. RBCli is a framework to quickly develop advanced command-line tools in Ruby. It has been written from the ground up with the needs of the modern technologist in mind, designed to make advanced CLI tool development as painless as possible. In RBCli, low-level code has been wrapped and/or replaced with higher-level methods. Much of the functionality has even been reduced to single methods: for example, it takes just one declaration to define, load, and generate a user's config file at the appropriate times. Many other features are automated and require no work by the engineer. These make RBCli a fundamental re-thining of how we develop CLI tools, enabling the rapid development of applications for everyone from hobbyists to enterprises.</p>
|
625
|
+
<p>Some of its key features include:</p>
|
626
|
+
<ul>
|
627
|
+
<li>
|
628
|
+
<p><strong>Simple DSL Interface</strong>: To cut down on the amount of code that needs to be written, RBCli has a DSL that is designed to cut to the chase. This makes the work a lot less tedious.</p>
|
629
|
+
</li>
|
630
|
+
<li>
|
631
|
+
<p><strong>Multiple Levels of Parameters and Arguments</strong>: Forget about writing parsers for command-line options, or about having to differentiate between parameters and arguments. All of that work is taken care of.</p>
|
632
|
+
</li>
|
633
|
+
<li>
|
634
|
+
<p><strong>Config File Generation</strong>: Easily piece together a default configuration even with declarations in different parts of the code. Then the user can generate their own configuration, and it gets stored in whatever location you'd like.</p>
|
635
|
+
</li>
|
636
|
+
<li>
|
637
|
+
<p><strong>Multiple Hooks and Entry Points</strong>: Define commands, pre-execution hooks, post-execution hooks, and first_run hooks to quickly and easily customize the flow of your application code.</p>
|
638
|
+
</li>
|
639
|
+
<li>
|
640
|
+
<p><strong>Logging</strong>: Keep track of all instances of your tool through logging. Logs can go to STDOUT, STDERR, or a given file, making them compatible with log aggregators such as Splunk, Logstash, and many others.</p>
|
641
|
+
</li>
|
642
|
+
<li>
|
643
|
+
<p><strong>Local State Storage</strong>: Easily manage a set of data that persists between runs. You get access to a hash that is automatically kept in-sync with a file on disk.</p>
|
644
|
+
</li>
|
645
|
+
<li>
|
646
|
+
<p><strong>Remote State</strong>: It works just like Local State Storage, but store the data on a remote server! It can be used in tandem with Local State Storage or on its own. Currently supports AWS DyanmoDB. </p>
|
647
|
+
</li>
|
648
|
+
<li>
|
649
|
+
<p><strong>State Locking and Sharing</strong>: Share remote state safely between users with built-in locking! When enabled, it makes sure that only one user is accessing the data at any given time.</p>
|
650
|
+
</li>
|
651
|
+
<li>
|
652
|
+
<p><strong>Automatic Update Notifications</strong>: Just provide the gem name or git repo, and RBCli will take care of notifying users!</p>
|
653
|
+
</li>
|
654
|
+
<li>
|
655
|
+
<p><strong>External Script Wrapping</strong>: High-level wrapping for Bash scripts, or any other applcication you'd like to wrap into a command.</p>
|
656
|
+
</li>
|
657
|
+
<li>
|
658
|
+
<p><strong>Project Structure and Generators</strong>: Create a well-defined project directory structure which organizes your code and allows you to package and distribute your application as a Gem. Generators can also help speed up the process of creating new commands, scripts, and hooks!</p>
|
659
|
+
</li>
|
660
|
+
</ul>
|
661
|
+
<p>If you're just getting started with RBCli, take a look at the <a href="tutorial/10-getting_started/">Tutorial</a>. Or take a look at the <a href="advanced/user_config_files/">Advanced</a> menu above to look through RBCli's additional featureset.</p>
|
662
|
+
|
663
|
+
|
664
|
+
|
665
|
+
|
666
|
+
|
667
|
+
|
668
|
+
|
669
|
+
|
670
|
+
|
671
|
+
</article>
|
672
|
+
</div>
|
673
|
+
</div>
|
674
|
+
</main>
|
675
|
+
|
676
|
+
|
677
|
+
<footer class="md-footer">
|
678
|
+
|
679
|
+
<div class="md-footer-nav">
|
680
|
+
<nav class="md-footer-nav__inner md-grid">
|
681
|
+
|
682
|
+
|
683
|
+
<a href="imported/quick_reference/" title="Quick Reference" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
|
684
|
+
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
685
|
+
<span class="md-flex__ellipsis">
|
686
|
+
<span class="md-footer-nav__direction">
|
687
|
+
Next
|
688
|
+
</span>
|
689
|
+
Quick Reference
|
690
|
+
</span>
|
691
|
+
</div>
|
692
|
+
<div class="md-flex__cell md-flex__cell--shrink">
|
693
|
+
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
|
694
|
+
</div>
|
695
|
+
</a>
|
696
|
+
|
697
|
+
</nav>
|
698
|
+
</div>
|
699
|
+
|
700
|
+
<div class="md-footer-meta md-typeset">
|
701
|
+
<div class="md-footer-meta__inner md-grid">
|
702
|
+
<div class="md-footer-copyright">
|
703
|
+
|
704
|
+
<div class="md-footer-copyright__highlight">
|
705
|
+
Copyright © 2018 Andrew Khoury
|
706
|
+
</div>
|
707
|
+
|
708
|
+
powered by
|
709
|
+
<a href="https://www.mkdocs.org">MkDocs</a>
|
710
|
+
and
|
711
|
+
<a href="https://squidfunk.github.io/mkdocs-material/">
|
712
|
+
Material for MkDocs</a>
|
713
|
+
</div>
|
714
|
+
|
715
|
+
|
716
|
+
|
717
|
+
</div>
|
718
|
+
</div>
|
719
|
+
</footer>
|
720
|
+
|
721
|
+
</div>
|
722
|
+
|
723
|
+
<script src="./assets/javascripts/application.a59e2a89.js"></script>
|
724
|
+
|
725
|
+
<script>app.initialize({version:"0.17.5",url:{base:"."}})</script>
|
726
|
+
|
727
|
+
|
728
|
+
|
729
|
+
|
730
|
+
|
731
|
+
</body>
|
732
|
+
</html>
|